2015-01-11 24 views
1

我有下面的代碼重寫引用內存:由一個的memmove

int** x; 

// Add 4 int pointers to x - code ommitted 

// Pop the first element 
int* a = x[0]; 
memmove(&x[0], &x[1], sizeof(int*) * 3); 
x = realloc(x, sizeof(int*) * 3); 

// Some code that uses 'a' - ommitted 

按我的理解a正指向在第一位置x點。但是,該內存位置現在實際上包含之前由於memmove而導致的x[1]中的數據。

看看如何使用此代碼,看起來a實際上應該指向之前在x[0]上的值。我的問題是,如果a如果內存位置現在已被x[1]中的內容替換,那麼如何包含該先前的值?

+0

你在'a'中拷貝了'X [0]'拷貝0 [0]用來指向 – Jasen

+2

你的理解(或你的措辭)是錯誤的。 'a'指向存儲在'x [0]中的任何地址'值向下移動一個與'a'無關並且不相關。有*兩份*該地址的副本;在換班前,一個在'a'和一個在'x [0]'中。之後,有一個(在'a'中)。 – WhozCraig

+0

@WhozCraig'memmove(&x [0],&x [1],sizeof(int *)* 3);'看起來不錯,我認爲這會導致未定義的行爲,因爲它們是兩個不同的指針, sizeof(int *)* 3'它應該是'sizeof(int)* 3'? – Gopi

回答

2

a是在您更改(通過memmove)x[0]的值之前爲其指定值x[0]的棧上的變量。因此,a將保留x [0]的值,並且陣列x將具有存儲在x[0],x[1],x[2]的原始x[1],x[2],x[3]

因此基本上充當局部變量,其是x [0]處的數據的副本。所述數據是一個整數指針,但可以是其他任何東西。

+0

即使指針「a」在棧中,它指向的實際數據在堆中,對不對?被覆蓋? – thameera

+1

@thameera這個答案是正確的,我的只會複製它,所以如果有任何你可以/應該接受它關於指向堆的實際數據,這取決於你存儲在'x [ 0]'。 *沒有*這*有*在堆上。 'int ar [4]; int * x [4] = {ar,ar + 1,ar + 2,ar + 3};'這裏沒有堆,你的代碼對這個'x'依然有效。 – WhozCraig