我們先看下面這樣一段代碼:
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";
現在我們再運行下看看結果:
這下果然正確了