咱們先看下面這樣一段代碼:ios
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拷貝到從該位置開始以後的內存中。函數
結果爲xy123ABCspa
然而咱們運行一下這段代碼發現程序崩潰了,咱們調用堆棧發現函數定位在這一行code
咦,這是怎麼回事blog
趕忙再查查strcat函數的用法,發現當連接p1和p2字符串的時候,將連接的字符串一塊兒內存
存入p1中,那麼就隱含了這麼個意思,就是說P1的大小必需要容得下連接後的字符串。字符串
可是本質上是字符串"123"是保存在程序中的常量區,而常量區只能進行讀操做不能進行寫io
操做class
那麼咱們在棧區定義一個較大的數組來保存鏈接後的結果。
char p1[20]="123";
如今咱們再運行下看看結果:
這下果真正確了