【问题标题】:Realloc trouble重新分配麻烦
【发布时间】:2020-03-17 09:32:12
【问题描述】:

我有问题。 我中风了:“/hello/world” 我需要将单词 'hello' 复制到另一个字符串;

我有这个代码:

void copy(char *command) {// copy 
 char *word = NULL;
 int size = 1;
 if (*command == '/') {
    command++;
    while (*command != '/') {
         word = (char*)realloc(word, size * sizeof(char));
         *word = *command;
         size++;
         word++;
         command++;
     }
     printf("%s", word);
     free(word);
}

但我收到此错误:Segmentation fault (core dumped)

我做错了什么?

【问题讨论】:

  • word++ 这是错误的。 realloc 需要从先前的 mallocrealloc 调用返回的相同指针作为第一个参数。通过增加指针,您将丢失原始指针。至于分段错误,很可能是因为您没有 NUL 终止您的字符串。
  • 调试此问题和大多数其他错误的最佳方法是使用调试器。调试器至少会立即准确地告诉您哪一行代码触发了段错误。

标签: c malloc realloc


【解决方案1】:

正如@kaylum 所说,您收到错误的原因是您更改了word 指针的值。当您为已分配的内存块数组重新分配内存并更改该内存块的大小时,realloc() 会更改大小并返回指向该已分配数组的第一个内存块的指针。在这种情况下,如果您想更改word 的内存大小,请尝试使用索引来访问新添加的内存块。

    void copy(char *command) {// copy
      char *word = NULL;
      printf("%s\n",command);
      int size = 1,index=0;``
      if (*command == '/') {
        command++;
        while (*command != '/') {
          word = (char*)realloc(word, size * sizeof(char));
          word[index] = *command;
          size++;
          command++;
          index++;
        }
        printf("%s\n", word);
        free(word);
      }
    }

【讨论】:

  • 最好在while循环后面加上word[index]='\0'。反正我很喜欢这段代码。
  • printf("%s\n", word); 导致 UB,因为 word 不指向 string。缺少'\0'。分配也不够大。
  • @hanie @chux 是的,它应该在 for 循环之后添加 '\0',使其成为一个字符串。
  • word 应重新分配给size+1 字节以允许空终止符,并且您必须在将word 传递给printf 之前设置空终止符以进行%s 转换。
猜你喜欢
  • 2013-06-15
  • 1970-01-01
  • 2012-09-11
  • 2012-07-24
  • 2023-03-09
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多