Realloc返回NULL

时间:2017-01-20 14:20:01

标签: c realloc

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。我的问题是:代码有问题还是我的内存不足?

3 个答案:

答案 0 :(得分:3)

如果realloc返回null,则首先打印出要分配的内存量。如果它是负数或大量,则存在问题。如果它是一个合理的数量,并且你有一个中等体面的机器,那么你最不可能是内存不足。所以malloc()系统必须以某种方式被破坏。要么你传递了一个无效的指针,要么你写了一个块的结尾,也许是在一个完全不相关的程序中。

答案 1 :(得分:0)

两个重大错误:

C数组索引从零开始,因此在重新分配到x * sizeof(thing)后,只有0到x-1的元素才有效。访问元素x将导致混乱。

其次,a = b修改a的本地副本,但不修改您希望它的值array ...

答案 2 :(得分:0)

realloc可以更改基址,但array指针会按值传递,因此reallocation中不会显示本地main并产生一些问题。< / p>

你也reallocate到0大小的数组,可能不是你想要的,请使用x+1作为重新分配中的记录数。更多,您在重新分配之前访问索引x,这是未定义的行为,因为重新分配大小为x-1之前,因此在重新分配后移动行a[x].aa = x

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