¿Qué es el error en este código C usando REALLOC?
-
25-10-2019 - |
Pregunta
Estoy tratando de tener algún tipo de estructura de matriz/datos de crecimiento dinámico en C. a continuación se encuentra el código C que tengo para ello. Pero después de imprimir la matriz, da un error de tiempo de ejecución como se muestra a continuación en la instantánea. ¿Qué va mal? Se está compilando utilizando MS-visual C ++ 2010 (versión gratuita) en un Windows-7.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a;
int i = 5;
if((a = (int *)malloc(i * sizeof(int))) == NULL) {
fprintf(stderr, "Error: failed malloc\n");
return 1;
}
for(i = 0; i < 5; i++)
a[i] = i;
printf("-- array after malloc\n");
for(i = 0; i < 5; i++)
printf(" a[%d] = %d\n", i, a[i]);
if((a = (int *)realloc(a, i * sizeof(int))) == NULL) {
fprintf(stderr, "Error: failed realloc\n");
return 1;
}
for(i = 0; i < 10; i++)
a[i] = i;
printf("\n-- array after realloc\n");
for(i = 0; i < 10; i++)
printf(" a[%d] = %d\n", i, a[i]);
free(a);
return 0;
}
Solución
//<important>
//weren't you supposed to do i = 10 here ????
//</important>
if((a = (int *)realloc(a, i * sizeof(int))) == NULL) {
fprintf(stderr, "Error: failed realloc\n");
return 1;
}
for(i = 0; i < 10; i++)
a[i] = i;
Creo que se suponía que esto debía cambiar el tamaño de la matriz a 10 y usarlo, pero nunca cambiaste i
a 10
asi que i
es todavía 5
Y sales de rango
Otros consejos
En esta línea:
if((a = (int *)realloc(a, i * sizeof(int))) == NULL) {
i
todavía contiene el valor 5
. Así que básicamente eres realloc
'ing para 5 enteros mientras asigna 10 enteros en el siguiente bucle: un error.
Este sería el código fijo:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a;
int i;
if((a = (int *)malloc(5 * sizeof(int))) == NULL) {
fprintf(stderr, "Error: failed malloc\n");
return 1;
}
for(i = 0; i < 5; i++)
a[i] = i;
printf("-- array after malloc\n");
for(i = 0; i < 5; i++)
printf(" a[%d] = %d\n", i, a[i]);
if((a = (int *)realloc(a, 10 * sizeof(int))) == NULL) {
fprintf(stderr, "Error: failed realloc\n");
return 1;
}
for(i = 0; i < 10; i++)
a[i] = i;
printf("\n-- array after realloc\n");
for(i = 0; i < 10; i++)
printf(" a[%d] = %d\n", i, a[i]);
free(a);
return 0;
}