Realloc返回NULL

4
int main() {
    struct lottery *array;      

    array = (struct lottery *)malloc(3000 * sizeof(struct lottery));       
    int opt, counter;

    menu1();
    scanf("%d", &opt);
    if (opt == 1)
        Load(array, &counter);
    else
        exit("0");
    menu2();
    counter--;
    scanf("%d", &opt);
    while (opt != 7) {
        switch (opt) {
        case 1:
            Save(array);
            break;
        case 2:
            Enterd(array, &counter);
            printf("%d\n", counter);
            break;
        }
        menu2();
        scanf("%d", &opt);
    }
    return 0;
}

void Enterd(struct lottery *a, int *count) {
     struct lottery *b;
     int x;

     (*count)++;
     x = *count;

    printf("Your new data will have an ID of %d\n",x);
    a[x].aa = x;

    b = (struct lottery *)realloc(a, x * sizeof(struct lottery));
    if (b == NULL) {
        printf("Memory could not be allocated for your new input.Program will now exit...\n");
        exit("0");
    }

    a = b;

    printf("What is the date of your new draw?\n");
    scanf("%d/%d/%d", &a[x].date1.day, &a[x].date1.month, &a[x].date1.year);
    printf("Now please insert the 5 non-joker numbers\n");
    scanf("%d%d%d%d%d", &a[x].n1, &a[x].n2, &a[x].n3, &a[x].n4, &a[x].n5);
    printf("What is the 'Joker' number of this draw?\n");
    scanf("%d", &a[x].joker);
    printf("Your input is now complete.");
}

我正在撰写一份有关彩票文件的保护报告。在我的函数中,我遇到了一个问题,即向彩票数组添加更多数据。每当x包含1989时,我的realloc调用就会返回NULL。我将x设置为1985,i可以向数组中添加4个以上的输入,但是当x为1989时,它仍然返回NULL。我的问题是:代码是否有问题,还是我的内存仍然不足?


5
我们需要看到更多的代码,请您贴出一个包含main函数的代码,展示如何调用这个函数。 - Bathsheba
2
你不需要在 malloc/realloc 上进行强制类型转换。 - Ed Heal
1
请正确格式化您的代码。 - Jabberwocky
4
"exit"需要一个整数而不是一个字符串-用"exit(0)"替换"exit("0")"。 - Govind Parmar
3
struct lottery 的定义在哪里? - dbush
显示剩余13条评论
3个回答

5
如果realloc返回null,首先打印出您要分配的内存量。如果它是负数或巨大的数字,则存在问题。如果它是合理的数量,并且您有一台相当不错的机器,则极不可能耗尽内存。因此,malloc()系统必须以某种方式被损坏。要么您传递了无效的指针,要么您已经在块的末尾写入了过多的内容,也许是在程序的完全不相关部分进行的。

我问这个问题是因为我有8GB的内存,所以我认为不太可能会出现内存满的情况。 - Edward
现代计算机通常会“超额分配”内存,因此即使机器无法满足请求,它也会声称已经满足,并在实际使用内存时开始关闭应用程序。 - Malcolm McLean

0

两个重要的错误:

C 数组索引从零开始,所以在重新分配大小为 x * sizeof(thing) 的内存后,只有从零到 x-1 的元素是有效的。访问第 x 个元素会导致混乱。

其次,a = b 修改的是本地副本的 a,而不是您想要的值 array...


你的意思是我应该把 x 改成 x-1 吗? - Edward
关于第二个问题,在Load函数中它对我有效,它正确地改变了我的主数组。 - Edward
@Edward 1号,也许吧。你的代码太复杂了,很难轻易地看出来。 - Roddy
@Edward 2nd:如果realloc移动了内存,“array”将保留指向旧数据的指针。一种解决方法是使“enterd”返回指向新数据的指针。然后使用array = enterd(array, &counter) - Roddy

0

realloc 可以更改基础地址,但 array 指针是按值传递的,因此本地 reallocationmain 中不可见并且会产生一些麻烦。

您还可以重新分配为 0 大小的数组,这可能不是您想要的,请使用 x+1 作为重新分配中记录数的数量。再者,您在重新分配之前访问索引 x,这是未定义的行为,因为重新分配之前大小是 x-1,所以将 a[x].aa = x 放在重新分配后。

另外,请初始化您的变量(如 counter)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接