【问题标题】:realloc failing after multiple uses多次使用后 realloc 失败
【发布时间】:2019-02-24 18:02:03
【问题描述】:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    char string[10];
    int count = 0;
    int buff = 1;
    int i = 0;
    char **test = malloc(sizeof(char*) * buff);

    while (1) {
        scanf("%s", string);
        count++;
        if (count > buff) {
            buff += buff;
            test = realloc(test, buff);
            test[i] = string;
            i++;
        }
        else {
            test[i] = string;
            i++;
        }
    }
}

这只是一个更大的项目的一些测试代码,我正在处理同样的问题(因此为什么 buff 这么小)。我不知道为什么,但 realloc() 在 ~2-3 次调用后失败。任何的想法?

【问题讨论】:

  • 显然我使用的字符串少于 10 个字符,而 while 循环是非终止的,仅用于调试
  • 旁白:所有的指针都会指向同一个(最后输入的)字符串值。
  • @P__J__ 你在我打字时添加了补救措施 - 我没有注意到传递的评论。
  • 永远不要将realloc的返回值直接赋值给block,因为它可能返回NULL,之前的所有数据都会丢失。

标签: c malloc realloc


【解决方案1】:
 test = realloc(test, buff);

您在第一个 realloc 上分配两个 字节,然后是三个字节 ....,而不是两个、三个 ... 指针

的空间

您的程序只是一个巨大的未定义行为

 test = realloc(test, buff * sizeof(*test));

顺便说一句,所有分配的指针将指向内存中的同一位置

test[i] = string; 不为字符串分配空间,也不复制它。

test[0] == test[1] == test[2] .... ==test[n] 这是最后一个被扫描的字符串

要存储所有扫描输入的字符串,您需要分配内存并复制字符串

test[i] = malloc(strlen(string) + 1);
strcpy(test[i], string);

【讨论】:

  • 更好的写法sizeof(*test)
  • @JasonS 如果这个答案解决了你的问题,你应该accept it
  • 附加问题:不能为指针数组中的更多指针重新分配空间吗?我一直在尝试向“测试”数组添加更多指针,但似乎总是说无法进行重新分配。即使将上述答案移到我的代码中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2021-04-02
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多