C 2种免费通话方式-有区别吗?
在堆上分配内存后调用C 2种免费通话方式-有区别吗?,c,pointers,malloc,heap,free,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; 是的,有区别 变量2无效free需要一个以前由malloc、calloc或realloc返回的指针*p2是分配空间中的第一个int。正如man 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;
是的,有区别 变量2无效
free
需要一个以前由malloc
、calloc
或realloc
返回的指针*p2
是分配空间中的第一个int
。正如man free
所说,因此会出现未定义的行为(根据具体情况调整了报价):
free()。否则,[…]将发生未定义的行为
注:
是的<代码>免费(*p2)
无效
free
在给定的地址释放内存。思考:p1
的计算结果是什么?它的值是malloc
返回的指针-因此p1
计算为指向malloc
分配的内存的指针
*p2
的计算结果是什么?它的值是存储在p2
地址的整数。这可以是任何东西,它不太可能是有效的指针。因此,free
将尝试释放一个无效的内存地址,如果幸运的话,您将得到一个segfault。是的,这是有区别的。第一种方法是在指向由malloc
分配的内存的指针上调用。第二种方法调用这样一个指针的解引用,试图释放一些任意内存地址(该值保存在该指针指向的值中),但这是错误的
free(p1);
这是有效的,因为您将内存分配给p1
,然后分配给free
,因此没有问题
free(*p2);
它不太可能是有效的,因为*p2
可能是也可能不是有效的指针(需要有一个分配的memoty)
对未使用malloc或类似方法共享内存的指针使用free()将导致错误仅分配指针p1或p2,因此可以释放。用*p2解除对指针的引用只会得到分配块中的一个实例。只有当
p2
的地址传递给函数时,才会看到第二个变量(例如some_func(int**p){…}
并且调用some_func(&p2)
),然后在some_func
中,它对free(*p)有效代码>