尝试在C中执行strcat函数时的EXC_BAD_ACCESS

时间:2010-11-25 14:09:49

标签: c unix

我有一个我用C语言编写的程序,当我的代码到达这一行时:

strcat("md5 ", "blah");

我收到了EXC_BAD_ACCESS错误,我的应用崩溃了。据我所知,它没有任何问题,所以我认为一双新眼睛可以解决我的问题。有什么想法吗?

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

在C中,你必须提供自己存放东西的空间。 “md5”只有4个字符的空间(+ nul终结符)。没有足够的空间在那里追加“等等”。

更重要的是,您无法修改字符串文字。它们通常是只读的。 所以,你必须:

  • 提供存储空间,您可以存储新的连锁结果。
  • 确保该存储空间中有足够的空间用于生成的字符串。

E.g:

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

答案 2 :(得分:1)

提供给strcat的第一个字符串需要是一个可写缓冲区,第二个字符串的空间足够超过其当前内容。这意味着你不能使用字符串文字作为strcat()的第一个参数!

答案 3 :(得分:1)

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

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

由于你的第一个字符串是一个常量,你不知道它在内存中的位置,你不能使用它后面的内存。