在C中 - 在不同的上下文中释放内存

时间:2013-07-26 13:44:33

标签: c memory free

如果您要做类似的事情:

char array[2][5] = {"cars", "tags"}
char array2[] = "computer";

已分配的内存分配等于(对于第一行):

sizeof(array); OR
sizeof(char*10); 

或者你想要这样做。

或者,可以这样做:

char *ptr = "cars";
char *ptr2 = malloc(sizeof(*ptr2)*5);
*ptr2 = "cars";

我知道如果你使用指针明确地使用malloc分配内存,那么使用free(ptr)释放该指针是一个好习惯;

但是,当您按上述方式定义时,以下调用是否与显式内存分配相同?

free(ptr);
free(ptr2);
free(array);
free(array2);

- 顺便说一下,上面所有的decarations / initializations都是以字符串结尾的字符串,对吗?

5 个答案:

答案 0 :(得分:2)

您只需要free分配有malloc的内存,您指定的其他情况是指向字符串文字或自动变量(通常在堆栈上分配)的指针,试图释放它们是未定义的行为。< / p>

C样式字符串NULL已终止。

另外,需要注意的是:

*ptr2 = "cars";

语法不正确。

答案 1 :(得分:1)

在传递通过调用free分配的内容时,您应该只调用malloc。这意味着您应该只使用free拨打ptr2

此外,您的作业*ptr2 = "cars"是语法错误。您需要使用strcpy填充ptr2。像这样:

char *ptr2 = malloc(sizeof(*ptr2)*5);
strcpy(ptr2, "cars");

C字符串按惯例以null结尾,字符串文字(即"cars")以空值终止。

答案 2 :(得分:1)

*ptr2 = "cars";不是有效的声明。如果您想在其他地方指出ptr2,则需要使用:

ptr2 = "cars";

如果要覆盖内存ptr2,请使用strcpy

strcpy(ptr2, "cars");

只需要释放ptr2 - 这是您使用malloc分配的唯一一个。请注意,如果您进行上述ptr2 = "cars"作业,则无法释放您分配的原始内存。这是一个称为“内存泄漏”的逻辑错误。

答案 3 :(得分:1)

  

但是,当您按上述方式定义时,以下调用是否与显式内存分配相同?

不,malloccallocrealloc未归还的内存空闲非法。

  

以上所有的演示/初始化都是以字符串结尾的字符串,对吧?

是的,这些字符串称为字符串文字,将 NULL 终止。

答案 4 :(得分:1)

当您声明静态数组内存在代码块的末尾自动释放时,您只需释放已使用malloc分配的内存。