Ваш пример синтаксически неверен.
Для:
#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 привилегии для отображения первой страницы памяти)).