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

时间:2015-05-06 06:32:33

标签: c pointers strcat

我正在做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上运行时会出现总线错误。我不明白为什么......

2 个答案:

答案 0 :(得分:5)

在您的代码中

char *s = "Hello ";

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

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

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

  3. 您应该使用数组(位于读写内存中),其长度足够来保存生成的(最终)字符串(无内存溢出)。< / p>

    建议:不要对用户定义的函数使用与库函数相同的名称。使用其他名称,例如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);
    

答案 1 :(得分:1)

在最后一个地址指向

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

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

你应该通过使用malloc或声明数组样式

来保留s指向的足够内存
char s[32] = "Hello ";