2013-02-10 213 views
0

我試圖將一個指針(char **)的指針傳遞給一個將初始化它的函數,然後將它傳遞到另一個將釋放內存的函數,但是我在釋放上獲得seg錯誤,這導致我相信我的分配出錯了。分配和釋放指針指針

Valgrind正在報告在該生產線上使用未經初始化的價值。 tmp [i]指向0x0。

if(tmp[i]) free((char*)tmp[i]); 

下面是代碼(這僅僅是測試代碼)

void 
alloc_strings(char ***test, int count) 
{ 
    char **tmp = *test; 
    tmp = malloc(count * sizeof(char*)); 

    int i; 
    for(i = 0; i < count; i++) { 
    tmp[i] = malloc(6); 
    strcpy(tmp[i],"Hello"); 
    } 
} 

void 
free_strings(char ***test, int count) 
{ 
    char **tmp = *test; 

    int i; 
    for(i = 0; i < count; i++) { 
    if(tmp[i]) free((char*)tmp[i]); 
    } 

    if(tmp) 
    free(tmp); 
} 

,並且在調用:

int 
main(int argc, char **argv) 
{ 

    char **test; 
    alloc_strings(&test, 10); 
    free_strings(&test, 10); 

    return 0; 
} 

我一直在玩這個有一段時間了,閱讀起來指針等,但無法讓我的頭解決這個問題。任何想法非常感謝!

回答

1

您需要分配給*test,而不是從它進行分配。如何:

void 
alloc_strings(char ***test, int count) 
{ 
    char **tmp = malloc(count * sizeof *tmp); 
    /*...*/ 
    *test = tmp; 
} 
+0

正好。兩次(也在析構函數中) – wildplasser 2013-02-10 14:58:02

+0

@wildplasser我認爲析構函數很好,只是有點過於複雜。 – cnicutar 2013-02-10 14:59:16

+0

這很好(它破壞了......),但你希望它在返回之前設置'* test = NULL;'。 (順便說一句:構造函數有潛在的內存泄漏,如果*測試恰好指向先前分配的數組) – wildplasser 2013-02-10 15:02:31

0

在代碼示例,

alloc_strings(char ***test, int count) 
{ 
    char **tmp = *test; 

*test應該有一些空間來存儲指向目前未分配char **。因此,如果例子是,因爲這

char** array[1]; 

alloc_strings(&array[0], 7); 

我覺得代碼將工作。