我試圖將一個指針(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;
}
我一直在玩這個有一段時間了,閱讀起來指針等,但無法讓我的頭解決這個問題。任何想法非常感謝!
正好。兩次(也在析構函數中) – wildplasser 2013-02-10 14:58:02
@wildplasser我認爲析構函數很好,只是有點過於複雜。 – cnicutar 2013-02-10 14:59:16
這很好(它破壞了......),但你希望它在返回之前設置'* test = NULL;'。 (順便說一句:構造函數有潛在的內存泄漏,如果*測試恰好指向先前分配的數組) – wildplasser 2013-02-10 15:02:31