引用被 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] 处数据的副本。所述数据是一个整数指针,但可以是任何其他内容。
我有以下代码:
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] 处数据的副本。所述数据是一个整数指针,但可以是任何其他内容。