2014-03-02 82 views
0

我處理一個包含int和整數錯誤釋放一個結構

這裏有我的兩個功能的陣列結構內的數組時:

//stores array of char numbers in array of ints 
//returns pointer to SomeStruct 
SomeStruct *fromString(char *str){ 

    /*get string length*/ 
    int length = strlen(str); 


    SomeStruct *huge; 
    huge = malloc(sizeof(SomeStruct)); 

    /* incase malloc() fails */ 
    if (huge == NULL) { 
     return NULL; 
    } 
    huge->length = length; 
    huge->digits = malloc((sizeof(int))*length); 

    /*store chars as ints*/ 
    int i; 
    for(i=0;i<length;i++){ 
     if (str[i] == ""){ 
      huge->digits[i] = 0; 
     } 
     if (str[i] == '0'){ 
      huge->digits[i] = 0; 
     } 
     if (str[i] == '1'){ 
      huge->digits[i] = 1; 
     } 
     if (str[i] == '2'){ 
      huge->digits[i] = 2; 
     } 
     if (str[i] == '3'){ 
      huge->digits[i] = 3; 
     } 
     if (str[i] == '4'){ 
      huge->digits[i] = 4; 
     } 
     if (str[i] == '5'){ 
      huge->digits[i] = 5; 
     } 
     if (str[i] == '6'){ 
      huge->digits[i] = 6; 
     } 
     if (str[i] == '7'){ 
      huge->digits[i] = 7; 
     } 
     if (str[i] == '8'){ 
      huge->digits[i] = 8; 
     } 
     if (str[i] == '9'){ 
      huge->digits[i] = 9; 
     } 
    } 

    return huge; 
} 

//frees mem 
//returns NULL ptr to struct 
SomeStruct *destroy(SomeStruct *p){ 


    /*free each cell*/ 
    int i; 
    for(i=0;i<getLength(p);i++){ 
     free(p->digits[i]); 
    } 
    /*free p & return NULL*/ 
    free(p); 
    p=NULL; 

    return p; 
} 

和繼承人我的示例主要()

int main(){ 

    SomeStruct *z; 
    z = malloc(sizeof(SomeStruct)); 

    z = fromString("100100987654321"); 

    //printcheck 
    int i; 
    for(i=0;i<getLength(z);i++){ 
     printf("%d", z->digits[i]); 
    } 
    printf("\n"); 

    destroy(z); 

    return 0; 
} 

我編譯後,得到正確的打印輸出100100987654321,但一旦其命中破壞功能,我得到以下錯誤:malloc:*錯誤的對象0x2:被釋放的指針未分配。我玩弄破壞函數和免費(P)單獨不拋出一個錯誤,但當我嘗試釋放數組中的任何東西(P - >數字)時,我得到該錯誤消息。我認爲這個錯誤與fromString函數中的malloc有關,但是如何?感謝

+0

'str [i] ==「」'意思是什麼? –

+0

哎呦並不意味着在那裏。謝謝 – user2755244

+0

您要麼不啓用警告,要麼不關注它們。糟糕的做法。您希望在儘可能高的警告級別發出零警告。 –

回答

0

問題是這樣的:

/*free each cell*/ 
int i; 
for(i=0;i<getLength(p);i++){ 
    free(p->digits[i]); 
} 

你不想釋放每個單元格,要立即釋放他們。上述應

free(p->digits); 

更換記住,你是如何分配的內存是:

huge->digits = malloc((sizeof(int))*length); 

你沒有分配一個不同的指針的digits每一個元素,所以不需要單獨釋放每個元素。

如果使用的是Unix/Linux系統,在終端:

man 3 malloc

man 3 free

你會得到更多這方面的信息。

+0

謝謝!那工作。我認爲... huge-> digits = malloc((sizeof(int))* length);會根據長度的大小分配一組元素? – user2755244

+0

它的確如此。它分配一個連續的大塊內存來保存所有的'int'元素。但是你的循環做了什麼,把每個元素當作另一個指針,並試圖釋放每個元素。你有一大塊「int」,不是指向「int」的大塊指針。所以你只需要釋放塊,而不是塊的每個元素。 – user1118321

+0

感謝您的解釋 – user2755244