Edward
Edward

Reputation: 47

Realloc returning NULL

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.");
}

I am writing a protect about some lottery files. I have this problem in my function which is adding more data to the lottery array. Whenever x contains 1989, my realloc call returns NULL. I set x to be 1985 and i could add 4 more inputs to the array, but whenever x is 1989, it still returns NULL. My question is: is there something wrong with the code or I am still running out of memory?

Upvotes: 4

Views: 5689

Answers (3)

Jean-Baptiste Yunès
Jean-Baptiste Yunès

Reputation: 36391

realloc can change the base address, but array pointer is passed by value, so a local reallocation is not visible in the main and generates some trouble.

You also reallocate to 0-sized array, probably not what you want, please use x+1 as the number of records in the reallocation. More, you access index x before reallocation, which is undefined behavior as before reallocation size is x-1, so move the line a[x].aa = x after reallocation.

Also please initialize your variables (like counter).

Upvotes: 0

Malcolm McLean
Malcolm McLean

Reputation: 6406

If realloc returns null, firstly print out the amount of memory you are asking to allocate. If it is a negative number or a huge amount, there's the problem. If it is a sensible amount, and you have a halfway decent machine, it's most unlikely you are out of memory. So the malloc() system must have been corrupted in some way. Either you are passing an invalid pointer, or you have written past the end of a block, maybe in a totally unrelated part of the program.

Upvotes: 5

Roddy
Roddy

Reputation: 68023

Two significant errors:

C array indexing starts at zero, so after you realloc to x * sizeof(thing), only elements zero to x-1 are valid. Accessing element x will cause chaos.

Second, a = b modifies the local copy of a, but not the value array that you wanted it to...

Upvotes: 0

Related Questions