Можете ли вы поместить выделенные значения стека в массив, выделенный кучи - PullRequest
0 голосов
/ 11 февраля 2019

Мне было интересно, был ли у меня массив, выделенный для кучи, и я передал его в свою функцию.Если я заполню массив, выделенный в куче, в моей функции, не выделяя значения в куче (т. Е. Просто присваивая значения массиву кучи), это создаст ошибку, и я смогу получить доступ к значениям массива кучи вне функции или они будутисчезают, потому что переменные стека исчезают после завершения вызова функции.

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я думаю, что вы спрашиваете, если вы malloc массив и отправить его в функцию:

Я передал его в свою функцию.

ЧтоСлучается, что указатель на эту память (массив) создается в кадре стека функции.Массив не отправляется в функцию.И пока у вас достаточно места, вы можете обращаться с ним как с любым другим массивом.Когда функция завершается, указатель в ней выталкивается вместе с фреймом, но все данные находятся в массиве вызывающей функции (куча).Помните, что когда вы отправляете массив в fcn, на самом деле отправляется указатель на него.

Тот факт, что выделенная память - это куча, ничего не меняет.Просто убедитесь, что у вас достаточно места, и не переполняйте память.

РЕДАКТИРОВАТЬ

Если я заполнил массив, выделенный в куче, в моей функции без выделения кучи значений

Не уверен, что вашспрашивая, если ваш массив скажет int *p1 = malloc(50*sizeof(int));, то в функции вы можете поместить в него 50 дюймов.Если вы отправите только int *p, то нет.Плюс * р все равно в стеке.Для этого вам потребуется malloc памяти.

0 голосов
/ 12 февраля 2019

Когда вы используете malloc для массива, он действительно выделяет пространство для хранения множества элементов в массиве.Вот почему вы предоставляете malloc тип данных * емкость, больше ничего не нужно хранить в куче.

Как говорилось в предыдущих ответах, когда вы передаете массив в функцию, все, что хранится в стеке, это временный указатель, содержащий местоположение массива в куче.Поэтому, если вы измените значение, оно последует за указателем и изменит его там.

В этом случае не имеет значения, где были предварительно сохранены значения (переменная в стеке или другое значение в куче).) потому что когда он помещен в массив, единственное, что передается, - это значение.

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

Использование malloc для каждого элемента, который вы хотите добавить в массив, было бы кошмаром и победило бы цельразмещения массива в первую очередь.

0 голосов
/ 11 февраля 2019

Если вы спрашиваете «могу ли я скопировать значение из переменной, расположенной в стеке, в переменную, выделенную в куче», ответ - да.

Вы можете скопировать данные из кучи встек и наоборот.

int i = 50;
int *p = malloc(sizeof(int));

*p = i;
printf("%d\n", *p);

Если предположить, что malloc не удалось, вывод этой программы будет 50.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...