2015-05-05 52 views
0

我试图动态分配一个结构数组,但是每当我运行程序时,我不断得到:a.out(6487,0x7fff7ecb8300)malloc:*对象0x7fff6f670000错误:指针为realloc'没有被分配d *设置malloc_error_break断点调试指针被realloced没有分配

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

警告:在'malloc'(等等)中调用'sizeof' [你应该总是把它写成](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,其测量指针的大小,而不是指针对象的。

+0

谢谢!这固定了一切! – sukurity

4

在:

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

声明一个新的变量d与最初未定值和PAS把它分成realloc。修改成:

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

这是不是分配' sizeof(任何指针)'虽然?我期望'sizeof(struct node)'在那里。 – usr2564301

+0

@Jongware我纠正了这个问题,但没有提到它,希望读者能够留意。 –