Your example is syntactically invalid.
For:
#include <stdint.h>
typedef uint32_t my_element[16];
void foo(void) { my_element *element = 0; }
element
will have automatic storage duration.
Whether an implementation will use a stack, a register, completely optimize the variable out (these three are most likely) or something different the C standard does not specify.
The C standard describes semantics, not implementation details.
For
#include <stdint.h>
typedef uint32_t my_element[16];
void bar(void) { my_element *element = (my_element*)5; }
(the cast is required to satisfy constraints) the behavior would most likely be undefined because producing a pointer that's not sufficiently aligned for its target type results in undefined behavior (http://port70.net/~nsz/c/c11/n1570.html#6.3.2.3p7).
Moreover, even if you created a valid pointer pointing to address 5 (e.g., char *p5 = (char*)5;
(char
s have minimal alignment requirements) it would not be very useful (dereferencable) because operating systems generally don't allow you to map things to that address (on Linux, you need root privileges to map the first memory page)).