如果您要做类似的事情:
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都是以字符串结尾的字符串,对吗?
答案 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)
但是,当您按上述方式定义时,以下调用是否与显式内存分配相同?
不,malloc
或calloc
或realloc
未归还的内存空闲非法。
以上所有的演示/初始化都是以字符串结尾的字符串,对吧?
是的,这些字符串称为字符串文字,将 NULL 终止。
答案 4 :(得分:1)
当您声明静态数组内存在代码块的末尾自动释放时,您只需释放已使用malloc分配的内存。