strcat容易發生的錯誤
22六月07
以下這段程式碼乍看之下沒什麼錯誤
但通常程式記憶體區段錯誤(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()來避掉這樣的錯誤
感謝PTT C_and_CPP版coolbe大大的解惑:D
引自:http://blog.pixnet.net/chiakie/trackback/b6a4d51176/3043315
——————-
上個週末花了整天做 MFC,其實改到最後並沒有使用這個函數,
但是總覺得這個函數應該很常用到,所以找到了這篇很實用的文章!
也感謝作者同意轉載啦!
Filed under: 總得證明我肚子有點東西 | 5 Comments

看吧
妳在寫什麼我都看不懂…
不過看起來妳應該可以當我電腦的家庭醫師
她最近開機速度有點慢
跑的速度有點兒慢
常常反應慢半拍
我沒有亂灌程式
而且上禮拜終於做了三年以來第一次磁碟重組
哈哈哈
妳說說
她怎麼了??
不要告訴我該換電腦了…
這麼說很難診斷耶
感覺有很多可能性!!!
換台新電腦吧
科科
多谢你的指点,我非常受益!
但是……好像你的错误例子里面,宣告*a 也是用的char *a = (char *)malloc(20);啊,这个malloc() 似乎没有起什么作用啊。
在我的理解中
儘管宣告是有allocate一個新的空間給*a
但是在後面的程式碼
又重新把那個指標指到”Hello”
所以的確會造成一開始的char *a = (char *)malloc(20);這句沒有作用
Excellent!
It’s sovled my problem~
Very thanks for your help~