引用被 memmove 覆盖的内存

Referencing memory that is overwritten by a 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]上的值。我的问题是,如果该内存位置现在已被 x[1] 中的内容替换,a 怎么可能包含以前的值?

a 是堆栈上的一个变量,您在更改(通过 memmove)x[0] 的值之前为其分配了 x[0] 的值。因此,a 将保留 x[0] 的值,数组 x 将原始的 x[1],x[2],x[3] 存储在 x[0],x[1],x[2]

所以基本上 a 充当局部变量,它是 x[0] 处数据的副本。所述数据是一个整数指针,但可以是任何其他内容。