2016-09-29 77 views
2

所以我知道這個問題很可能以前被問過,但經過近一個小時的搜索之後,我決定要求所有這些。指點我已經回答的一個dublicate問題真的會被讚賞。更改指針(C)時數組元素會發生什麼?

然後,在基本的C語言編程中,我很好奇數組元素在改變指針指向別的元素時會發生什麼?它是否安全,沒有先釋放它?例如,

int main() 
{ 
    const int size = 3; 
    int *p_arr = malloc(size * sizeof(int)); 

    for(int i=0; i<size; i++) 
     p_arr[i] = i; 

    int arr[size] = {0,0,0}; 

    p_arr = arr; // safe!? 

    // What happens to the data previously allocated 
    // and stored in *p_arr? Should one first call, 
    // free(p_arr) 
    // and then reallocate ..? 
} 

實際上,更改指針會將數據{0,1,2}留在內存中。這個可以嗎?

非常感謝您的幫助!

+0

注意:VLA不能有初始化列表。另外'p_arr = &arr;' - >'p_arr = arr;'但是這會導致內存泄漏。 – BLUEPIXY

+0

這是內存泄漏。請參閱:[如果我在同一個指針(C)上使用malloc兩次會發生什麼?](http://stackoverflow.com/questions/19435433/what-happens-if-i-use-malloc-twice-on-the- same-pointer-c) –

+1

@BLUEPIXY ..是的,我同意,在創建MWE時我有點太快,但是這並不重要。不過,我已更正了錯字以及其他一些拼寫錯誤。 – magnus

回答

2

除了無法訪問數據(「泄漏」)以外,數據沒有任何反應,因此內存永遠被浪費,直到程序終止(通常情況下)才能用於其他任何事情。

不要這樣做,泄漏內存是非常糟糕的做法。

你應該在free()內存時不再需要它。

此外,分配可以寫成:

p_arr = malloc(size * sizeof *p_arr); 

以除去int類型的複製,並鎖定尺寸與實際的變量。這至少有點安全。

+0

「_因此記憶永遠被浪費了......」這聽起來非常令人難過,你對這個可憐的記憶做了些什麼。 –

+0

謝謝,這正是我所懷疑和需要得到的答案。謝謝!在達到期限時我會接受答案。 – magnus

+1

@GillBates這很重要,如果你對自己的資源感到滿意,它會有所幫助。 :) – unwind

0

數組{0,1,2}已經在內存中,但除非再次指向指向數組頭部地址的指針,否則無法獲取它。