2013-11-21 21 views
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; 

,並假設我做取消引用釋放的指針用C

free(array) 

我還可以依靠的事實,*int_in_array會給我6?

現在假設另外,我做

free(array[0]) 

話,我還可以依靠的事實,*int_in_array會給我6,因爲int_in_array仍指向6?

非常感謝!

+3

[請不要在C](http://stackoverflow.com/a/605858/28169)中輸入'malloc()'的返回值。 – unwind

+0

@unwind你應該施加'malloc()'的返回值,因爲它返回一個'void *',對吧? –

回答

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

你似乎有一個心理模型,你期望指針被魔法監督,這樣一個指針就能「知道」另一個指針發生了什麼。

這不是指針或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()

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.

0

當調用free(array)如所提到的訪問6相同的結果,int_in_array仍保證爲指向包含6一塊內存。 array本身可能會或可能不會繼續指向int_in_array,具體取決於它用於佔用的內存是否需要其他位置或其他一些其他情況。

當您致電free(int_in_array)時,您告訴系統您不再需要包含6的內存。指針值仍然相同,但不再保證6仍然是存儲在該位置的值。