strcat函數的坑點


我們先看下面這樣一段代碼:

 1 #include <iostream>
 2 #include <stdlib.h>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     char *p1= "123";
 8     char *p2= "ABC";
 9     char str[50]= "xyz";
10     strcat(p1,p2);
11     strcpy(str+2,p1);
12     cout<<str<<endl;
13     system("pause");
14     return 0;
15 }

咋一看,這段代碼的原意是將p2鏈接到p1的后面,p1為123ABC

然后將str字符數組向后移動兩個位置,將p1拷貝到從該位置開始之后的內存中。

結果為xy123ABC

 

然而我們運行一下這段代碼發現程序崩潰了,我們調用堆棧發現函數定位在這一行

 

咦,這是怎么回事

 

趕緊再查查strcat函數的用法,發現當鏈接p1和p2字符串的時候,將鏈接的字符串一起

存入p1中,那么就隱含了這么個意思,就是說P1的大小必須要容得下鏈接后的字符串。

但是本質上是字符串"123"是保存在程序中的常量區,而常量區只能進行讀操作不能進行寫

操作

 

那么我們在棧區定義一個較大的數組來保存連接后的結果。

char p1[20]="123";

現在我們再運行下看看結果:

這下果然正確了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM