我们说我的代码设置如下:
#include <stdlib.h>
#include <stdio.h>
int main() {
char* primary = malloc(10); // main pointer to heap memory
char* secondary = primary; // an alias for the main pointer
free(secondary);
}
free(secondary)
还会释放分配给primary
的内存吗?
答案 0 :(得分:4)
是的,free()
将适用于任何包含地址的指针,该地址又由malloc()
,calloc()
或realloc()
中的任何一个返回。虽然这样做有点危险,因为你冒险指针free()
两次。只有两个中的一个被传递给free()
并且在你做完之后你不能再用它们中的任何一个去做。
通常的做法是在将指针传递给NULL
之后立即将指针设置为free()
,以避免出现悬空poitner ,从而避免更多地释放指针不是一次&#34; 意外&#34;,在您描述的场景中,您只设置了NULL
指针之一的风险。
简而言之,如果您这样做,primary
将成为另一个悬空指针,其危险性仅为悬挂指针的secondary
两倍。
答案 1 :(得分:2)
指针值相同。将primary
分配给secondary
时,两个指针指向由malloc()
分配的相同内存地址。你可以free
其中一个(但不是两个)。
如果您实际上没有亲自致电malloc()
或free()
,这一点尤其有用。
考虑POSIX函数strdup()
,它将字符串复制到新分配的内存中。基本上为你调用malloc()
(或类似函数)。
char[] strarr = "I am a string.";
char* mystr = strdup(strarr);
/* do some stuff */
free(mystr)
strdup()
可能将其内存分配函数的结果存储在变量中,mystr
几乎肯定不是该函数体内的名称。该变量已返回并重新分配给mystr
,然后您必须free
。
答案 2 :(得分:1)
那么为什么我们不能使用
sizeof
或其他一些内置函数来查找指针数组的大小呢?
不要将语言与库混淆。 sizeof
不是函数,malloc
不是内置函数。
在C中,sizeof
是运算符,而不是函数。 (请注意,您无需声明它。)您可以这样说:
size_t size = sizeof(void*);
因为您没有将变量传递给sizeof
,而是传递表达式。表达式有一个类型,每个类型都有一个大小。
当你说
时char greeting[] = "hello";
size_t len = sizeof greeting;
len
为6,因为greeting
的类型为char[6]
。因为sizeof
是一个运算符,我们可以省略括号。括号通常与它一起使用,但仅用于避免操作符优先级问题。
C标准库定义malloc
和free
,但没有(我们称之为)size_of
函数来返回已分配块的大小。实现可以提供这样的功能。与维护堆相比,它在技术上是微不足道的。
为什么不提供“size_of
”?我会说,因为它不是很需要。虽然像memset
这样的函数可以在整个内存块上运行,但它们对部分块也很有用。块中的字节数通常不如它包含的更高级元素的数量(struct
或甚至只是int
)更有趣。我们可能会注意到,十年后设计的C ++ STL算法也不能在整个集合中运行,但需要从一开始就开始。停止参数。