使用指针在我自己的 strcat 中出现总线错误

Bus error in my own strcat using pointer

我正在做 strcat 函数的指针版本,这是我的代码:

void strcat(char *s, char *t);

int main(void) {
   char *s = "Hello ";
   char *t = "world\n";

   strcat(s, t);

   return 0;
}

void strcat(char *s, char *t) {
  while (*s)
    s++;

  while ((*s++ = *t++))
    ;
}

这看起来很简单,但是在我的 Mac OS 10.10.3 上 运行 时它会出现总线错误。我不明白为什么...

在你的代码中

char *s = "Hello ";

s 指向 字符串文字 ,它位于 只读 内存位置。所以,问题是双重的

  1. 尝试更改 字符串文字的内容 调用 undefined behaviour.

  2. (几乎忽略点 1) 目标指针没有足够的内存来保存连接的最终结果。内存溢出。再次 undefined behaviour.

您应该使用数组(驻留在读写内存中)具有足够的长度来保存结果(最终)字符串相反(没有内存溢出)。

建议:用户自定义函数不要和库函数重名。使用其他名称,例如 my_strcat().

伪代码:

  #define MAXVAL 512
  char s[MAXVAL] = "Hello";
  char *t = "world\n";    //are you sure you want the \n at the end?

然后

  my_strcat(s, t);

您要在最后一个地址 s 指向

之后添加 't' 的文本
char *s = "Hello ";
char *t = "world\n";

但是在 's' 之后写入是未定义的行为,因为编译器 可能 将该文本放入常量内存中,在您的情况下它会崩溃,所以它确实会崩溃。

你应该在 s 指向的地方保留足够的内存,使用 malloc 或声明它为数组样式

char s[32] = "Hello ";