Krótka odpowiedź na to pytanie brzmi: oczywiście że tak.
Oto dowód :)
#include <stdio.h>
#include <stdint.h>
struct A {
int8_t a;
int32_t b;
};
int main(void) {
volatile struct A * const ptrA = (void *)0x7ffc9e54cb12;
printf("Adres ptrA to: %p\n", (void *)ptrA);
return 0;
}
Nieco bardziej rozbudowana (i dokładniejsza odpowiedź) to sięgnięcie do standardu i przeczytanie że próba dostępu do adresu który nie należy do procesu/programu, kończy się zachowaniem niezdefiniowanym.
A możliwe powody to np:
1. Brak tego adresu w pamięci platformy sprzętowej - platformy systemowe mogą mieć luki w adresowaniu. Przypadek zachodzi dla programowania bez systemu operacyjnego, bezpośrednio na sprzęcie.
2. Brak tego adresu w pamięci procesu - proces nie ma przydzielonej przestrzeni pamięci z tym adresem. Przypadek dla systemów z zarządzaniem pamięcią.
3. Adres jest w pamięci zachowującej się inaczej niż "zwykły RAM" - to mogą być przestrzenie atomowej zmiany bitów (np. ARM), przestrzenie I/O, jakieś inne peryferia...
4. Adres jest niewyrównany - platforma może nie adresować poprawnie adresów wyrównanych do nietypowych dla niej wartości. To może np. spowodować błąd platformy.
5. Adresowanie platformy jest nietypowe - przypadki zachodzą dla np. platform DSP.
6. Struktura danych ma nieprawidłowe wyrównanie - dostęp do pól może nie być realizowany z pożądanym offsetem. Tu prosty przykład dla x86:
#include <stdio.h>
#include <stdint.h>
struct A {
int8_t a;
int32_t b;
};
int main(void) {
struct A a;
printf("Adresy składników struktury A:\n a = %p\n b = %p\n",
(void *)&a.a, (void *)&a.b);
printf("Wielkości pól struktury A:\n sizeof(a) = %zu\n sizeof(b) = %zu\n",
sizeof(a.a), sizeof(a.b));
printf("Wielkość struktury A:\n sizeof(struct A) = %zu\n", sizeof(struct A));
return 0;
}
Wynik (u Ciebie mogą być inne adresy):
Adresy składników struktury A:
a = 0x7ffe2c749b40
b = 0x7ffe2c749b44
Wielkości pól struktury A:
sizeof(a) = 1
sizeof(b) = 4
Wielkość struktury A:
sizeof(struct A) = 8
Jak popatrzysz uważnie, suma wielkości pól nie równa się wielkości struktury. Także adresy elementów struktury, różnią się od siebie "nie o ich wielkość".
7. Inne (egzotyczne) powody dla danej platformy - np. obecność rejestrów CPU pod danym adresem :)