在C中释放Realloc&#d; D阵列

时间:2015-04-11 14:04:18

标签: c arrays dynamic realloc

我刚开始学习malloc&d以及realloc< d阵列。任何人都可以帮我解释如何正确释放我的以下阵列?我曾尝试查看其他帖子,但我很难理解C中的内存分配。

char ** result = NULL;
int numSpaces = 0;

char * p = strtok(command, " ");

/* split string and append tokens to 'result' */
while (p)
{
    result = realloc (result, sizeof (char*) * ++numSpaces);

    if (result == NULL)
        exit (-1); /* memory allocation failed */

    result[numSpaces-1] = p;

    p = strtok(NULL, " ");
}

2 个答案:

答案 0 :(得分:4)

释放realloc - 内存与释放malloc内存并没有什么不同,因为您需要的最后一点是free上的result,当你不再需要记忆时。

但是,您的代码有一种可能导致内存泄漏的模式:您将realloc - ed块分配回result而不检查NULL。如果realloc失败,result的先前值将无法恢复,因为它已被NULL覆盖。

以下是解决此问题的方法:

char **temp = realloc(result, sizeof (char*) * ++numSpaces);

if (temp == NULL) {
    free(result); // Free the old memory block
    exit (-1); /* memory allocation failed */
}
result = temp;

答案 1 :(得分:3)

在您完成result之后的某个时刻,您需要致电free(result);

这可能如下所示:

char ** result = NULL;
int numSpaces = 0;

char * p = strtok(command, " ");

while (p) {
    result = realloc (result, sizeof (char*) * ++numSpaces);
    result[numSpaces-1] = p;
    p = strtok(NULL, " ");
}

for (i=0; i<numSpaces; ++i)
    printf("word %d: %s\n", i, result[i]);

free(result);