int** array = (int**) malloc(1*sizeof(int*));
int* int_in_array = (int*) malloc(1*sizeof(int));
*int_in_array = 6
array[0] = int_in_array;
并假设我
free(array)
我仍然可以依赖*int_in_array
给我6的事实吗?
现在假设另外,我做
free(array[0])
那么,我可以依靠*int_in_array
给我6个事实,因为int_in_array
仍指向6吗?
非常感谢!
答案 0 :(得分:2)
你似乎在某种程度上有一个心理模型,你希望指针被神奇地监督,以便一个指针“知道”另一个指针会发生什么。
这不是指针或C内存模型的工作方式。
不同指针之间没有联系。如果两个指针指向同一个地址,并且您free()
其中一个指针,则另一个指针变为无效但它的值不会更改。第一个的价值也没有;它只是取消引用它们中的任何一个只是成为无效的事情。
考虑一下:
int *a = malloc(sizeof *a);
if(a != NULL)
{
int *b = a;
*a = 4711;
printf("a=%p\nb=%p\n", (void *) a, (void *) b);
free(b); /* same pointer that malloc() returned, this is fine */
printf("a=%p\nb=%p\n", (void *) a, (void *) b);
}
以上将打印相同的地址四次,因为任何指针的值都不会因为你在其中一个上调用free()
而改变。请记住,free()
不是魔术,它只是一个功能。它没有特殊的隐藏功能,如果您愿意,可以编写自己的malloc()
和free()
,并获得完全相同的语义。
答案 1 :(得分:0)
int** array = (int**) malloc(1*sizeof(int*));
int* int_in_array = (int*) malloc(1*sizeof(int));
*int_in_array = 6
array[0] = int_in_array;
执行free(array)
后,您仍然可以访问和使用int_in_array
。但之后您无法拨打free(array[0])
,因为您无法再使用array
。
如果您不是free(array)
而只是free(array[0])
,则无法使用*int_in_array
,因为您释放了内存。
答案 2 :(得分:0)
6
存储在int * int_in_array
指向的内存中。
因此,如果您free()
此内存(通过执行free(int_in_array)
)6
已消失,或者至少不再可访问而不会引发未定义的行为。
在array
指向的内存中,存储int_in_array
值的副本。因此,通过调用free()
free(array)
此副本不会影响int_in_array
中存储的内容。并且这个值所指向的记忆也不会受到影响。
数组指向的数据可以通过执行*array
或执行array[0]
直接访问。存储时int_in_array
free(array[0]
的副本与执行free(int_in_array)
的副本相同。在访问{1>}时获得的结果与1中提到的相同。
答案 3 :(得分:0)
当您致电free(array)
时,int_in_array
仍然可以保证指向包含6
的内存。 array
本身可能会或可能不会继续指向int_in_array
,具体取决于它曾占用的内存是否需要占用其他地方,或者是其他许多情况。
当您致电free(int_in_array)
时,您告诉系统您不再需要包含6
的内存。指针值仍然相同,但不再保证6
仍然是存储在该位置的值。