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()來避掉這樣的錯誤

感謝PTT C_and_CPP版coolbe大大的解惑:D
引自:http://blog.pixnet.net/chiakie/trackback/b6a4d51176/3043315

——————-
上個週末花了整天做 MFC,其實改到最後並沒有使用這個函數,
但是總覺得這個函數應該很常用到,所以找到了這篇很實用的文章!
也感謝作者同意轉載啦!

廣告

6 thoughts on “strcat容易發生的錯誤

  1. 看吧
    妳在寫什麼我都看不懂…
    不過看起來妳應該可以當我電腦的家庭醫師
    她最近開機速度有點慢
    跑的速度有點兒慢
    常常反應慢半拍
    我沒有亂灌程式
    而且上禮拜終於做了三年以來第一次磁碟重組
    哈哈哈
    妳說說
    她怎麼了??
    不要告訴我該換電腦了…

  2. 多谢你的指点,我非常受益!
    但是……好像你的错误例子里面,宣告*a 也是用的char *a = (char *)malloc(20);啊,这个malloc() 似乎没有起什么作用啊。

  3. 在我的理解中
    儘管宣告是有allocate一個新的空間給*a
    但是在後面的程式碼
    又重新把那個指標指到"Hello"
    所以的確會造成一開始的char *a = (char *)malloc(20);這句沒有作用

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s