Realloc falla después de la décima iteración dentro de un bucle

Estoy intentando obtener una secuencia de letras del usuario y colocar la entrada dentro de una matriz dinámica.

Sin embargo, por una razón que no puedo descifrar – el realloc falla (se devuelve NULL y se imprime “¡Error al asignar memoria!”) Si el usuario ingresó más de 10 letras. Intenté cambiar realloc a calloc y eso parece resolverlo, pero no estoy seguro de por qué.

#include  #include  int main (int argc, char **argv) { char *first_string, *second_string, *memory_check; char user_input; int first_string_size = 0, second_string_size = 0, debug =1; first_string = malloc(sizeof(char)); second_string = malloc(sizeof(char)); // gets the strings from the user printf("Input the first string:"); for(int i = 0;;i++) { user_input= getchar(); if(user_input == EOF || user_input == '\0' || user_input == '\n') { break; } first_string[i] = user_input; memory_check = realloc(first_string, (i+1)*(sizeof(char))); if(memory_check == NULL) { printf("\nError allocating memory!\n"); break; } first_string_size = i; if(debug == 1) { printf("\n number of letters is %d", first_string_size +1); printf("\n array size in memory is %d", sizeof(first_string) * (i+1)); } } return 0; } 

por supuesto que falla:

 memory_check = realloc(first_string, (i+1)*(sizeof(char))); if(memory_check == NULL) { printf("\nError allocating memory!\n"); break; } 

estás usando memory_check como indicador para verificar si puedes reasignar, pero no es solo eso.

Tienes que asignarlo de nuevo a first_string .

En su caso, es un sorteo: las primeras 10 veces (en su caso, por supuesto, esto no está especificado o definido, es completamente aleatorio), la región de la memoria no necesita ser movida, lo que explica que funcione . Pero después de un tiempo, realloc no puede reutilizar el mismo bloque (porque es demasiado pequeño) y cambia la ubicación de la memoria.

Como no lo estás actualizando, obtienes un comportamiento indefinido.

Podrías hacer esto:

 memory_check = realloc(first_string, (i+1)*(sizeof(char))); if(memory_check == NULL) { printf("\nError allocating memory!\n"); free(first_string); break; } first_string = memory_check; 

Estás escribiendo en memoria desasignada.

memory_check es el puntero recién reasignado, necesita intercambiar este valor con first_string . first_string apunta a la memoria que ya se ha liberado (por realloc)