Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 2种免费通话方式-有区别吗?_C_Pointers_Malloc_Heap_Free - Fatal编程技术网

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)有效