2011-04-09 39 views
0
int main() {  
    Employee *array[SIZE]; //Employee is a typedef struct --includes char *name, DATE *dateOfBirth, DATE is also a typedef struct, has 3 int fields month, day, year,` 

fillArray(array, &count, fpin1, fpin2); 

freeMemory(array, int count); 

} 

fillArray(Employee *array[], int *count, FILE *fpin1, FILE *fpin2) 
    char buffer[MAX], buffer2[MAX]; 
    while (fgets(buffer, MAX, fpin1) != NULL && fgets(buffer2, MAX, fpin2) != NULL){ 
     array[*count]->name = (char *) malloc(sizeof(char)*25); 
     assert(array[*count]->name != NULL); 
     strncpy(array[*count]->name, buffer, 15); 

     strncpy(buffer2, temp, 2); 
     array[*count]->dateOfBirth->day = atoi(temp) 
} 

該代碼編譯,但保持與分段錯誤失敗,它似乎失敗在我的fgets?或我的malloc,我做錯了什麼?我似乎無法弄清楚。帶有可能指向malloc分配字段的struct字段的常量指針數組?

而且你會如何去在

freeMemory(Employee *array[], int count) 

函數釋放該內存?

+0

我建議分離'malloc'和分配。兩者都可以導致'segfault',因爲您在同一行中有一個數組訪問權限。另外爲什麼不爲了調試而在這裏和那裏放置一些'printf'? – julkiewicz 2011-04-09 18:51:34

+0

'count'是什麼? – Muggen 2011-04-09 19:00:08

+0

有很多printf語句遍佈它,但我仍然很困難......它會在一段時間後死亡 - 這是沒有意義的,因爲它只是一個fgets函數,如果我有一些如何設法經過malloc之後它會發生故障。如果我註釋掉malloc並讓它做一些簡單的事情(將一個int放入結構體的一個字段中),它最終會通過文件,然後再次執行段錯誤。 – Wilson11 2011-04-09 19:02:04

回答

0

應該是:

int main() {  
    Employee array[SIZE]; //Employee is a typedef struct --includes char *name, DATE *dateOfBirth, DATE is also a typedef struct, has 3 int fields month, day, year,` 

fillArray(&array, &count, fpin1, fpin2); 

freeMemory(&array, int count); 

} 

你是不是在任何地方分配你的Employee對象,所以數組[0]指向一些隨機地址。

+0

不包含Employee數組[SIZE];在編譯時分配內存? '#define SIZE 25'順便提一句 – Wilson11 2011-04-09 19:07:19

+0

@ Wilson11:它爲'Employee'分配一個'SIZE'指針數組。它不分配'SIZE'結構。此外,您可能希望該結構的'dateOfBirth'成員只是一個'DATE'而不是'DATE'的指針,因爲它的大小是固定的,您不希望爲每個元素分配它。 – tomlogic 2011-04-09 19:11:05

+0

我該如何爲它分配內存,因爲它是一個常量指針,我無法觸及主方法或具有結構定義的.h文件。 – Wilson11 2011-04-09 19:20:17

0
Employee* array[SIZE]; 

這是一個存儲指向Employee結構體的指針的數組。

我想你的意思

fillArray(Employee* array[], int* count, FILE *fpin1, FILE *fpin2) 
{ 
    char buffer[MAX], buffer2[MAX]; 
    int i = 0; 
    while (fgets(buffer, MAX, fpin1) != NULL && 
      fgets(buffer2, MAX, fpin2) != NULL) 
    { 
     // the array does not hold any valid memory address. 
     array[i] = malloc(sizeof(Employee)); 
     assert(array[i] != NULL); 

     // now on the new employee add some char memory 
     (array[i])->name = malloc(sizeof(char) * 25); 
     assert(array[i]->name != NULL); 

     strncpy(array[i]->name, buffer, 15); 
     strncpy(buffer2, temp, 2); 

     array[i]->dateOfBirth->day = atoi(temp) 

     ++i; 
     (*count)++; 
    } 
} 

array[*count]除了尋找古怪,總是會修改同一個索引。你從未在任何地方修改過*count

此代碼不檢查您是否超過了傳遞的array的範圍。

另外:爲freeMemory()

freeMemory(Employee* array[], int count) 
{ 
    int i = 0; 
    while(i < count) 
    { 
     free(array[i]); 
     array[i] = NULL; 
     ++i; 
    } 
} 
+0

錯誤地複製了代碼,計數是增量。 – Wilson11 2011-04-09 19:09:21

+1

你忘記了malloc'dateOfBirth','freeMemory()'函數在釋放array [i]之前需要釋放'array [i] - > dateOfBirth'和'array [i] - > name'。 – tomlogic 2011-04-10 00:14:40

+0

@tomlogic,oops thats correct。但是現在我認爲OP會看到邏輯。 – Muggen 2011-04-10 00:16:01