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.

enter image description here

#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;
}
¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top