【问题标题】:Bus error in my own strcat using pointer使用指针在我自己的 strcat 中出现总线错误
【发布时间】:2015-05-06 06:32:32
【问题描述】:

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

【问题讨论】:

  • 请发布一些上下文,最重要的是,您如何调用函数以及使用什么参数?你如何定义和初始化你传递的指针?
  • 你确定s指向的内存有足够的空间来添加t并且t是空终止的吗?
  • 哦,顺便说一句,您忘记终止生成的字符串。
  • 该函数还应该返回一些内容以防连接时出错。
  • I'm doing a pointer version of the strcat() function.. 现在怎么样了?

标签: c pointers strcat


【解决方案1】:

在您的代码中

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

【讨论】:

    【解决方案2】:

    在最后一个地址 s 指向之后添加 't' 的文本

    char *s = "Hello ";
    char *t = "world\n";
    

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

    您应该通过使用 malloc 或将其声明为数组样式来保留 s 指向的足够内存

    char s[32] = "Hello ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 2020-09-01
      • 1970-01-01
      • 2021-10-21
      相关资源
      最近更新 更多