Ссылка на память, которая перезаписывается 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
указывает на. Но эта область памяти теперь фактически содержит данные, которые ранее были на x[1]
из-за memmove
,
Глядя на то, как этот код используется, кажется, что a
на самом деле должен указывать на значение, которое было ранее на x[0]
, У меня вопрос, как это возможно для a
содержать это предыдущее значение, если это место памяти было заменено тем, что было в x[1]
?
1 ответ
a
переменная в стеке, которой вы присвоили значение x[0]
до того, как вы изменили (по memmove) значение x[0]
, Следовательно, a сохранит значение x[0], а массив x будет иметь исходный x[1],x[2],x[3]
хранится в x[0],x[1],x[2]
Таким образом, в основном, действует как локальная переменная, которая является копией данных в точке x[0]. Указанные данные являются целочисленным указателем, но могут быть чем угодно.