Ссылка на память, которая перезаписывается 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]. Указанные данные являются целочисленным указателем, но могут быть чем угодно.

Другие вопросы по тегам