Размер инициализации массива C в байтах - PullRequest
0 голосов
/ 03 апреля 2011

Я ожидал, что размер следующей инициализации массива составит 32. 1 байт символов, 2 байта для каждого элемента в списке, 16 элементов .... = 32. Однако это 128 байтов.Почему?

char* cmds[] = {"AQ", "BD", "LS", "TW", "AS", "CP", "TR", "CO", "BF", "MS", "SR", "TL", "WT", "PM", "TE", "TC"};
printf("%li\n", sizeof(cmds));
//result is 128
//size of list is 16
//8 bytes per item in the list
//why?

Ответы [ 3 ]

8 голосов
/ 03 апреля 2011

Это потому, что у вас есть массив указателей на char.Каждый указатель является 8-байтовым (на x64), поэтому 16 указателей x 8 байт = 128 байт.

2 голосов
/ 03 апреля 2011

У вас есть массив указателей на строки, а компилируемая вами архитектура имеет 8-байтовый размер указателя.8 байт, умноженных на 16 указателей, равны 128 байтам.

1 голос
/ 03 апреля 2011

Кроме того, если массив будет не одним из указателей, а обычными символами, поскольку у вас не один символ, а несколько на элемент, тогда каждый элемент будет содержать три символа, включая NULL в конце. Таким образом, у вас будет 16 * 3 = 48 байтов.

...