【问题标题】:EXC_BAD_ACCESS (Code 2, Address=.....) [duplicate]EXC_BAD_ACCESS(代码2,地址=.....)[重复]
【发布时间】:2013-09-03 05:45:06
【问题描述】:

我是 C 编程的新手,正在尝试运行一个简单的程序,它将字符串 t 放在字符串 s 的末尾:

#include <stdio.h>

void _strcat(char *s, char *t){
    for(;*s;s++);
    for(;(*s=*t)!='\0';s++,t++);

}

int main()
{
    char *s="hello";
    char *t="how are you?";

    _strcat(s,t);

    getchar();
    return 0;
}

但分配两个指针(相同类型)*s=*t; 时,我经常遇到烦人的错误 这是错误:

线程 1:EXC_BAD_ACCESS(代码 2,地址=.....)

【问题讨论】:

  • 与您的问题无关,但您不应该使用带前导下划线的全局名称,这些名称由 C 规范保留。
  • 1.它被称为“Xcode”,而不是“XCODE”。 2. 但这无论如何与Xcode无关。 3. 这是一个骗局。 4. 我没有看到问题。 5. 以下划线开头的标识符保留给实现。如果您将函数命名为 _strcat,那么您的程序会调用未定义的行为。

标签: c


【解决方案1】:

字符串字面量是只读的,所以试图修改一个是未定义的行为。不仅如此,它们只是字符串的确切大小(加上一个用于终止符),所以第一个字符串不适合添加的第二个字符串,因此您将覆盖一些内存,从而导致更多未定义的行为。

您要附加到的字符串应声明为一个数组,该数组大到足以容纳两个字符串。比如:

char s[128] = "hello";

如何只使用指针并在堆上分配:

char *s = malloc(128);
strcpy(s, "hello");

使用后不要忘记free分配的内存。

【讨论】:

  • 感谢 Joachim,您帮了很多忙。但是我想用指针来写,你知道如何用指针而不是数组来写吗?
  • @Shahb 然后在堆上分配内存,例如malloc。有关示例,请参阅我的更新答案。
猜你喜欢
  • 2013-11-06
  • 2014-06-22
  • 2019-01-04
  • 2015-10-07
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多