当指向已分配内存的指针分配给结构成员时,需要帮助来生成正确的语法以释放char **的内存

时间:2014-09-13 02:13:44

标签: c pointers memory-management

所以基本上当我尝试为已分配的char **释放内存时,我无法弄清楚代码中的问题是什么。我创建了char **然后为它分配了内存,然后我将指向这个char **的指针分配给了我的struct的成员。当我试图使用struct member的指针释放内存时,我收到错误: 对象0x796568796568的 malloc: 错误:未释放指针*

以下是代码的一些部分:

Struct part:
struct TokenizerT_ {
    char **currentToken;
    char **tokens;
}tokenizer;

分配部分(在单独的功能中完成):

char **words;
    words = (char **)malloc(sizeof(char*) * (numberOfWords + 1));
    for (int i = 0; i < numberOfWords; i++)
        words[i] = (char *)malloc(strlen(ts)+1);


tokenizer.tokens = words;
tokenizer.currentToken = words;

解放部分:

int i = 0;
while(*(*tk).tokens){
    free((*tk).tokens[i]);
    i++;
}

free((*tk).tokens);

2 个答案:

答案 0 :(得分:2)

首先,您应该意识到*(*tk).tokens等同于(*tk).tokens[0]。所以你的循环总是检查相同的元素作为停止条件(并且在释放后该元素未设置为NULL,因此条件继续为真。)

如果您希望通过NULL指针检查停止释放循环,则首先需要确保words的最后一个元素已分配NULL。现在由malloc分配的内存未初始化,因此您需要使用以下内容显式初始化最后一个元素:

words[numberOfWords] = NULL;

然后在解除分配时,您需要将循环停止条件更新为:

int i = 0;
while((*tk).tokens[i]){
    free((*tk).tokens[i]);
    i++;
}
free((*tk).tokens);

答案 1 :(得分:1)

添加“words [i] = 0;”到分配部分,让你的while循环停止?

for (int i = 0; i < numberOfWords; i++)
    words[i] = (char *)malloc(strlen(ts)+1);
words[i] = 0;