Что происходит со значениями в стеке, которые помещаются в массив в куче - PullRequest
0 голосов
/ 19 мая 2019

Я хочу знать, если я создаю массив в куче в C ++ и назначаю данные из стека массиву, что именно происходит? Копируются ли данные в кучу?

фрагмент кода:

int a = 1;
int b = 2;
int *c = new int(3);
int *arr = new int[3];
arr[0] = a;
arr[1] = b;
arr[2] = *c;

1 Ответ

0 голосов
/ 19 мая 2019

int a = 3; а имеет значение 3. адрес памяти для 0x345A или что-то вроде этого. А в стеке.

int *p = &a; указателю p присваивается адрес a. Адрес памяти p равен 0x123B или что-то в этом роде. Этот адрес памяти содержит значение 0x345A, указывающее место, где хранится значение 3. Указатель p находится в стеке.

Вы получите 3, если вы напечатаете a и *p, поскольку они получают свои значения из одной и той же ячейки памяти.

Вы получите 0x345A, если вы напечатаете &a и p, поскольку адрес a равен значению p.

Вы получите 0x123B, если вы напечатаете &p, поскольку это место в памяти для указателя p.

Предполагая, что * c указывает на целое число в куче, вы можете сохранить значение c (которое является адресом памяти целого числа в куче) в массиве.

int *arr = new int[3];
...
arr[2] = c;

То, что вы НЕ хотите делать, это:

int foo = 10;
arr[2] = &foo;

Теперь ваш массив указывает на область памяти, которая находится в стеке. Будет работать нормально, пока вы находитесь в этой функции, но будет указывать на мусор после выхода из функции и восстановления стека.

...