user18014778
user18014778

Reputation:

My program crashes when using realloc in C

#include <stdio.h>
#include <stdlib.h>

char **Names;
int size = 2;       //Minimum size for 2D array

void main() {

    int i;
    Names = (char **)malloc(size * sizeof(char *));      // First initaliaion  of 2D array in heap
    for (i = 0; i < size; i++)
        Names[i] = (char *)malloc(20 * sizeof(char));

    printf("\nenter");
    for (i = 0; i < size; i++)
        scanf("%s", Names[i]);

    while (1) {
        size++;
        Names = (char **)realloc(Names, size * sizeof(char *));       //Dynamic allocation of 2D aray
        for (i = 0; i < size; i++)
            Names[i] = (char *)realloc(Names[i], 20 * sizeof(char));

        i = size - 1;
        printf("\nenter");
        scanf("%s", Names[i]);

        for (i = 0; i < size; i++)
            printf("\n%s", Names[i]);
    }
}

It doesn't crash immediately it depends on the "size" I initialized. It crashes after 5 allocations for me. I tried adding free function but it did not seem to help.

Upvotes: 1

Views: 503

Answers (1)

Vlad from Moscow
Vlad from Moscow

Reputation: 311146

After this memory reallocation

   size ++;
   Names= (char**)realloc(Names,size*sizeof(char *)); 

the last pointer pf the array of pointers has an indeterminate value because it was not initialized.

As a result the call of realloc for the last pointer in this loop

    for (i=0; i<size; i++)
        Names[i] = (char*)realloc(Names[i],20*sizeof(char));

invokes undefined behavior.

Before executing the loop you need to initialize the last pointer at least like

Names[size-1] = NULL;

In fact there is no sense to use the for loop because what you need is to allocate memory for the newly added pointer. The allocated memory pointed to by the early created pointers is not being changed in size.

So instead of

    for (i=0; i<size; i++)
        Names[i] = (char*)realloc(Names[i],20*sizeof(char));

you could just write

Names[size-1] = malloc( 20 * sizeof( char ) );

Pay attention to as you have an infinite loop then the memory reallocation sooner or later can fail.

Also according to the C Standard the function main without parameters shall be declared like

int main( void )

Upvotes: 3

Related Questions