что такое ошибка в этом C-коде с использованием realloc? - PullRequest
1 голос
/ 25 июля 2011

Я пытаюсь создать некую динамически растущую структуру массива / данных в C. Ниже приведен код C, который у меня есть для этого. Но после распечатки массива он выдает ошибку во время выполнения, как показано ниже на снимке. Что не так? Он компилируется с использованием MS-Visual C ++ 2010 (бесплатная версия) на 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;
}

Ответы [ 2 ]

2 голосов
/ 25 июля 2011
//<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;

Я думаю, что это должно было изменить размер массива до 10 и использовать его, но вы никогда не меняли i на 10, поэтому i по-прежнему 5 и вы выходите за пределы диапазона

1 голос
/ 25 июля 2011

В этой строке:

if((a = (int *)realloc(a, i * sizeof(int))) == NULL) {

i по-прежнему содержит значение 5.Таким образом, в основном вы realloc используете 5 целых чисел, в то время как вы назначаете 10 целых чисел в следующем цикле: ошибка.

Это будет фиксированный код:

#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;
}
...