2011-12-10 92 views
0

在C上分配結構的動態數組Valgrind發現此錯誤:使用大小爲8的未初始化值。嘗試訪問結構成員時彈出錯誤。在C上分配結構的動態數組。

避免這種情況的方法是什麼?

void find_rate() 
{ 
    int num_lines = 0; 
    FILE * in; 
    struct record ** data_array; 
    double * distance; 
    struct record user_record; 

    in = open_file(); 

    num_lines = count_lines(in); 

    allocate_struct_array(data_array, num_lines); 

    data_array[0]->community_name[0] = 'h';  // the error is here 
    printf("%c\n", data_array[0]->community_name[0]); 

    fclose(in); 
} 

FILE * open_file() 
{ 
    ..... some code to open file 
    return f; 
} 

int count_lines(FILE * f) 
{ 
    .... counting lines in file 
    return lines; 
} 

這裏是我分配的數組的方式:

void allocate_struct_array(struct record ** array, int length) 
{ 
    int i; 

    array = malloc(length * sizeof(struct record *)); 

    if (!array) 
    { 
     fprintf(stderr, "Could not allocate the array of struct record *\n"); 
     exit(1); 
    } 

    for (i = 0; i < length; i++) 
    { 
     array[i] = malloc(sizeof(struct record)); 

     if (!array[i]) 
    { 
     fprintf(stderr, "Could not allocate array[%d]\n", i); 
     exit(1); 
    } 
    } 
} 
+0

其結構錯誤?你還可以添加valgrind輸出嗎? – IanNorton

+0

你可以粘貼結構記錄的定義嗎? – Louis

回答

3

既然你傳遞數組的地址給函數allocate_struct_array

您需要:

*array = malloc(length * sizeof(struct record *)); 

而且在呼叫功能中,您需要聲明data_array爲:

struct record * data_array; 

,並通過其作爲地址:

allocate_struct_array(&data_array, num_lines); 
+0

'sizeof(struct record *)'?應該是'sizeof(struct record)'或'sizeof(** array)'。 – AusCBloke

+0

如果你的意思像這裏 - http://stackoverflow.com/q/8460874/1090944,沒有工作。 – user1090944

+0

@AusCBloke sizeof(struct record *)表示指向struct record的指針大小的內存分配。 – user1090944