2种免费通话方式 - 有区别吗?

时间:2015-09-13 17:46:50

标签: c pointers malloc heap free

在堆上分配内存后调用free的两个变体之间是否存在差异:

// variant 1
int* p1 = (int*) malloc(sizeof(int)*4);
free(p1);

//variant 2
int* p2 = (int*) malloc(sizeof(int)*4);
free(*p2);
*p2 = NULL;

4 个答案:

答案 0 :(得分:6)

是的,有区别。

变体2无效。 free需要先前由malloccallocrealloc返回的指针。不过,*p2是分配空间中的第一个int 。正如man free所述,因此会出现未定义的行为(针对此特定情况调整的报价):

  

free()函数释放[p1]指向的内存空间,该内存空间必须由之前调用malloc()calloc()或{{1}返回}}。否则,会发生[...]未定义的行为。

注意:

答案 1 :(得分:2)

是。 free(*p2)无效。

free将内存释放到它给出的地址。考虑一下:p1评估的内容是什么?它的值是malloc返回的指针 - 所以p1计算指向malloc分配的内存的指针。

*p2评估的内容是什么?它的值是存储在p2地址的整数。这可以是任何东西,它不太可能成为有效的指针。因此,free将尝试释放无效的内存地址,如果您幸运,您将获得段错误。

答案 2 :(得分:0)

是的,有区别。第一种方法,调用指向由malloc分配的内存的指针是正确的。第二个,调用这种指针的解除引用,试图释放一些任意的内存地址(指针所指向的中保存的值),并且是错误的。

答案 3 :(得分:0)

free(p1);

这在您将内存分配到p1然后free时有效,因此没问题。

free(*p2);

它不太可能有效,因为*p2可能是也可能不是有效指针(需要有分配的记忆)。

在指针上使用free(),而不是使用malloc或类似的内存,将导致错误