2016年2月20日 星期六

strcat

以下這段程式碼乍看之下沒什麼錯誤
但通常程式記憶體區段錯誤(segmentation fault)都是這樣子產生的

錯誤的例子:
char *s1 = (char *)malloc(20);
char *s2 = "world!!";
s1 = "Hello ";
strcat(s1, s2);

正確的例子:
char *s1 = (char *)malloc(20);
char *s2 = "world!!";
strcpy(s1, "Hello ");
strcat(s1, s2);

一般來說strcat(char *a, char *b)不會自行配置空間
所以字串a後面必須要有足夠的空間給b才不會發生錯誤

有以下兩種解決方法:
1) 將a宣告成已知個數的陣列char a[20] = "Hello ";

2) 將a宣告成char *a = (char *)malloc(20);
而上述錯誤的例子到底錯在哪裡呢
錯在 s1 = "Hello "; 這行
s1被重新指向一個新的字串所在的記憶體位址而非原先配置的空間
所以執行strcat()時當然會碰觸到不該碰觸的記憶體空間
在正確的例子裡我們用strcpy()來避掉這樣的錯誤

http://chiakie.pixnet.net/blog/post/3043315-%5Bc-language%5D-strcat%28-%29-%E7%9A%84%E4%BB%8B%E7%B4%B9%E8%88%87%E6%98%93%E7%99%BC%E7%94%9F%E7%9A%84%E9%8C%AF%E8%AA%A4

沒有留言:

張貼留言