在C中解除引用释放的指针

时间:2013-11-21 14:18:19

标签: c pointers free

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吗?

非常感谢!

4 个答案:

答案 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)

  1. 6存储在int * int_in_array指向的内存中。

    因此,如果您free()此内存(通过执行free(int_in_array)6已消失,或者至少不再可访问而不会引发未定义的行为。

  2. 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仍然是存储在该位置的值。