2015-05-05 2 views
0

Я пытаюсь динамически выделять массив структур, но всякий раз, когда я запускаю программу, я продолжаю получать: a.out (6487,0x7fff7ecb8300) malloc: * ошибка для объекта 0x7fff6f670000: указатель realloc ' д не был выделен * установить контрольную точку в malloc_error_break для отладкиПерераспределение указателя не было выделено

struct node { 
    char course[25]; 
    char category[20]; 
    char prereq[50]; 
    char notes[50]; 
}; 



int main(int argc, char* argv[]) 
{ 
    FILE *fp; 
    char *filename = argv[1]; 
    char *token; 

    char buffer[100]; 
    char *del = ",\n"; 
    int num = 5, i = 0, j =0, count = 0; 
    struct node *d = malloc(num * sizeof(struct node)); 
    char** complete = malloc(num * sizeof(char*)); 
    printf("%s\n", filename); 


    if((fp = fopen(filename, "r")) == NULL) 
    { 
     printf("unable to open %s\n", filename); 
     exit(1); 
    } 
    while(fgets(buffer, sizeof(buffer), fp) != NULL) 
    { 

     if(count == num) 
     { 
      num = num + 5; 
      struct node *d = realloc(d, sizeof(d)*num); 
      printf("Reallocating\n"); 
     } 
     token = strtok(buffer, del); 

     if(strncmp(token, "#", 1) != 0) 
     { 

      strcpy(d[count].course, token); 
      printf("%s\n", d[count].course); 
      strcpy(d[count].category, strtok(NULL, del)); 
      printf("%s\n", d[count].category); 
      strcpy(d[count].prereq, strtok(NULL, del)); 
      printf("%s\n", d[count].prereq); 
      strcpy(d[count].notes, strtok(NULL, del)); 
      printf("%s\n", d[count].notes); 
      count++; 
     } 


    } 
+1

перед использованием 'argv [1]', проверьте, является ли 'argc == 2'. просто предложение. –

+1

Предупреждение: при вызове 'sizeof' в' malloc' (и тому подобное) [вы всегда должны его писать] (http://stackoverflow.com/a/17258659/1151654) как 'ptr = malloc (sizeof (* ptr) * ...); 'вместо' ptr = malloc (sizeof (ptrtype *) * ...); '. – Eregrith

+1

И, таким образом, 'struct node * d = realloc (d, sizeof (d) * num);' неверно: это должно использовать 'sizeof (* b)', а не 'sizeof (b)' – Eregrith

ответ

6
struct node *d = realloc(d, sizeof(d)*num); 

Вы объявляя новую переменную, которая d теней предыдущий, и кормить его еще не неинициализированный значение realloc.

Вы должны сделать это:

struct node *newD = realloc(d, num * sizeof *d); 
if(!newD) { 
    // Allocation failure, do something about it and break out 
} /* else */ 
d = newD; 

Также обратите внимание, что я исправил sizeof, который измерил размер указателя, а не pointee годов.

+0

Спасибо! Это все! – sukurity

4

в:

struct node *d = realloc(d, sizeof(d)*num); 

, который объявляет новую переменную d с исходно неопределенным значением и па ses it в realloc. Изменение, что:

struct node *tmp = realloc(d, sizeof(*d)*num); 
if(!tmp) 
    ; // handle error 
d = tmp; 
+0

Не выделяет ли это ' sizeof (любой указатель) 'хотя? Я бы ожидал 'sizeof (struct node)' там. – usr2564301

+0

@ Jongware Я исправил это, но не упомянул об этом, надеясь, что читатель обратит внимание. –