free()是否可以处理C中数组的第二个指针?

时间:2016-07-21 22:30:14

标签: c malloc

我们说我的代码设置如下:

#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的内存吗?

3 个答案:

答案 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标准库定义mallocfree,但没有(我们称之为)size_of函数来返回已分配块的大小。实现可以提供这样的功能。与维护堆相比,它在技术上是微不足道的。

为什么不提供“size_of”?我会说,因为它不是很需要。虽然像memset这样的函数可以在整个内存块上运行,但它们对部分块也很有用。块中的字节数通常不如它包含的更高级元素的数量(struct或甚至只是int)更有趣。我们可能会注意到,十年后设计的C ++ STL算法也不能在整个集合中运行,但需要从一开始就开始。停止参数。