2

如果您要执行以下操作:

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);

-- 顺便说一句,上面所有的声明/初始化都是隐含的以 NULL 结尾的字符串,对吧?

4

5 回答 5

2

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

C 风格的字符串被NULL终止。

另外,需要注意的是:

*ptr2 = "cars";

不是正确的语法。

于 2013-07-26T13:47:32.643 回答
1

你应该只free在传递分配给malloc. 这意味着你应该只打电话freeptr2.

此外,您的分配*ptr2 = "cars"是语​​法错误。您将需要使用strcpy来填充ptr2. 像这样:

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

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

于 2013-07-26T13:48:00.743 回答
1

*ptr2 = "cars";不是一个有效的陈述。如果你想指向ptr2其他地方,你需要使用:

ptr2 = "cars";

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

strcpy(ptr2, "cars");

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

于 2013-07-26T13:48:06.083 回答
1

但是,当您如上所述定义事物时,以下调用是否与显式分配内存的理由相同?

malloc不,释放or callocor未返回的内存是非法的realloc

上面所有的声明/初始化都是隐式的以 NULL 结尾的字符串,对吧?

是的,这些字符串称为字符串文字,并且将以NULL结尾。

于 2013-07-26T13:48:54.303 回答
1

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

于 2013-07-26T13:52:44.193 回答