多次使用后重新分配失败

时间:2019-02-24 18:02:03

标签: c malloc realloc

#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次通话后失败了。任何想法?

1 个答案:

答案 0 :(得分:1)

 test = realloc(test, buff);

您在第一次重新分配时分配了两个字节,然后分配了三个字节....,而不是两个,三个... 指针

的空间

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

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