我有一個程序,我用C寫單,而當我的代碼到達該行執行strcat的功能:EXC_BAD_ACCESS當試圖在C
strcat("md5 ", "blah");
我得到一個EXC_BAD_ACCESS錯誤,和我的應用程序崩潰。據我所知,它沒有任何問題,所以我認爲一雙新的眼睛可能會解決我的問題。有任何想法嗎?
我有一個程序,我用C寫單,而當我的代碼到達該行執行strcat的功能:EXC_BAD_ACCESS當試圖在C
strcat("md5 ", "blah");
我得到一個EXC_BAD_ACCESS錯誤,和我的應用程序崩潰。據我所知,它沒有任何問題,所以我認爲一雙新的眼睛可能會解決我的問題。有任何想法嗎?
您試圖修改一個常量字符串。 strcat
的第一個參數也是目標字符串,在你的情況下它是一個常量字符串。你應該使用類似:
char s[100];
strcpy(s, "md5 ");
strcat(s, "blah");
提供給strcat的第一個字符串必須是一個寫緩衝與第二串過去的當前內容足夠的空間。這意味着你不能使用字符串文字作爲strcat()的第一個參數!
根據http://www.cplusplus.com/reference/clibrary/cstring/strcat/:
將源字符串到目的字符串的副本。目標中的終止空字符被源的第一個字符覆蓋,並且在由目標中的兩個串聯形成的新字符串的末尾附加新的空字符。
由於您的第一個字符串是一個常量,您不知道它在內存中的位置,並且您不允許使用它跟隨的內存。
在C中,您必須提供自己存儲位置的空間。 「md5」只有4個字符的空間(+ nul終止符)。沒有足夠的空間在那裏追加「blah」。
更重要的是,您不能修改字符串文字。他們通常只讀。 所以,你必須:
例如爲:
char result[9]; //the result here needs 8 characters + a nul terminator
strcpy(result,"md5 ");
strcat(result,"blah"
或者,例如
const char *a = "md5 ";
const char *b = "blah";
char *result = malloc(strlen(a) + strlen(b) + 1);
if(result == NULL) {
out of memory
return;
}
strcpy(result,a);
strcat(result,b);
嘗試爲您編譯器啓用警告。 – Anycorn 2010-11-25 14:14:25
如果您使用GCC,可以使用`-Wall`啓用警告。不幸的是,它並沒有警告這個錯誤。 – 2010-11-25 14:16:20