Не думайте, что память, в которой хранится указатель для имени, совпадает с памятью, в которой хранятся данные для имени. Предполагая 4-байтовый размер слова, у вас есть следующее:
char * (4 bytes)
int (4 bytes)
int (4 bytes)
int (4 bytes)
================
total: 16 bytes
, что: sizeof(char*) + sizeof(int) + sizeof(int) + sizeof(int)
. C знает размер, потому что вы указали размер элементов в определении структуры.
Я думаю, что вас смущает следующее:
Содержимое в char *
будет ячейкой памяти (например, 0x00ffbe532
), где будет храниться фактическая строка. Не думайте, что содержимое структуры является смежным (из-за указателя). На самом деле, вы можете быть уверены, что их не будет.
Итак, повторим, например, struct Person
(это всего лишь пример, местоположения не будут одинаковыми в реальной программе.)