C语言 2种呼叫免费的方式-有区别吗?



在堆上分配内存后调用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;

是有区别的。

变量2无效。free需要一个先前由malloccallocrealloc返回的指针。*p2是分配空间中的第一个int 。正如man free所说,因此会发生未定义的行为(针对此特定情况调整了引用):

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


指出:

  • 不强制转换malloc
  • 的结果

是。free(*p2)无效

free释放指定地址的内存。考虑一下:p1的值是多少?它的值是malloc返回的指针,因此p1的计算结果是指向malloc分配的内存的指针。

*p2的值是多少?它的值是存储在p2地址的整数。这可以是任何东西,它不太可能是一个有效的指针。因此,free将尝试释放一个无效的内存地址,如果你幸运的话,你会得到一个段错误。

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

free(p1);

当您将内存分配给p1free时,这是有效的,因此没有问题。

free(*p2);

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

对未使用malloc或类似方式分配内存的指针使用free()将导致错误

最新更新