Расположение в памяти указателя, объявленного внутри функции - PullRequest
0 голосов
/ 28 мая 2020

Если я объявляю указатель внутри функции, находится ли он в стеке функций или в куче?

Пример:

typedef  uint32 my_element[16];
void foo()
{
my_element element* CSAAddress = 5;
}

В этом случае где элемент my_element находится в памяти?

Ответы [ 2 ]

4 голосов
/ 28 мая 2020

Ваш пример синтаксически неверен.

Для:

#include <stdint.h>
typedef  uint32_t my_element[16];
void foo(void) { my_element *element = 0; }

element будет иметь automati c продолжительность хранения .

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

Стандарт C описывает семантику, а не подробности реализации.

Для

#include <stdint.h>
typedef  uint32_t my_element[16];
void bar(void) { my_element *element = (my_element*)5; }

(приведение требуется для удовлетворения ограничений) поведение, скорее всего, будет undefined, поскольку создание указателя, недостаточно выровненного для его целевого типа, приводит к неопределенное поведение (http://port70.net/~nsz/c/c11/n1570.html#6 .3.2.3p7 ).

Более того, даже если вы создали действительный указатель, указывающий на адрес 5 (например, char *p5 = (char*)5; (char s имеют минимальные требования к выравниванию) это было бы не очень полезно (разыменовываемое), потому что операционные системы обычно не позволяют вам отображать вещи на этот адрес (для Linux вам нужны root привилегии для отображения первой страницы памяти)).

1 голос
/ 28 мая 2020

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

Также обратите внимание, что вы указываете на случайное пространство памяти с помощью используя my_element element* = 5; Обратите внимание , что ваше выражение - my_element element* CSAAddress = 5; является синтаксической ошибкой .

ПРИМЕЧАНИЕ : Следующее относится к списку основной момент, связанный с вопросом из приведенной ниже ссылки

Сегмент стека используется для хранения переменных, которые создаются внутри функций (функция может быть основной функцией или определяемой пользователем функцией), переменная типа -

  • Локальные переменные функции (включая переменные-указатели)

  • Аргументы, переданные в функцию

  • Адрес возврата

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

...