2010-11-25 57 views
2

我有一个程序,我用C写单,而当我的代码到达该行执行strcat的功能:EXC_BAD_ACCESS当试图在C

strcat("md5 ", "blah"); 

我得到一个EXC_BAD_ACCESS错误,和我的应用程序崩溃。据我所知,它没有任何问题,所以我认为一双新的眼睛可能会解决我的问题。有任何想法吗?

+1

尝试为您编译器启用警告。 – Anycorn 2010-11-25 14:14:25

+0

如果您使用GCC,可以使用`-Wall`启用警告。不幸的是,它并没有警告这个错误。 – 2010-11-25 14:16:20

回答

8

您试图修改一个常量字符串。 strcat的第一个参数也是目标字符串,在你的情况下它是一个常量字符串。你应该使用类似:

char s[100]; 
strcpy(s, "md5 "); 
strcat(s, "blah"); 
1

提供给strcat的第一个字符串必须是一个缓冲与第二串过去的当前内容足够的空间。这意味着你不能使用字符串文字作为strcat()的第一个参数!

1

根据http://www.cplusplus.com/reference/clibrary/cstring/strcat/

将源字符串到目的字符串的副本。目标中的终止空字符被源的第一个字符覆盖,并且在由目标中的两个串联形成的新字符串的末尾附加新的空字符。

由于您的第一个字符串是一个常量,您不知道它在内存中的位置,并且您不允许使用它跟随的内存。

3

在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);