Размер массива символов и размер символьного указателя

У меня есть кусок кода C, и я не понимаю, как работает функция sizeof(...):

#include <stdio.h>

int main(){
   const char  firstname[] = "bobby";
   const char* lastname = "eraserhead";
   printf("%lu\n", sizeof(firstname) + sizeof(lastname));
   return 0;
}

В приведенном выше коде sizeof (firstname) равен 6, а sizeof (lastname) - 8.

Но bobby имеет ширину 5 символов, а eraserhead - 11 ширины. Я ожидаю 16.

Почему sizeof ведет себя по-разному для массива символов и указателя на символ?

Может ли кто-нибудь уточнить?

Ответы

Ответ 1

firstname - массив char, несущий завершающий 0 -терминатор. lastname - указатель. На 64-битных системных указателях ширина 8 байтов.

Ответ 2

sizeof массив - это размер общего массива, в случае "bobby" - 5 символов и один трейлинг \0, который равен 6.

sizeof указатель - это размер указателя, который обычно составляет 4 байта в 32-разрядной машине и 8 байтов в 64-разрядной машине.

Ответ 3

Размер вашего первого массива - это размер bobby\0. \0 - символ терминатора, поэтому он равен 6.

Второй размер - это размер указателя, который составляет 8 байт в вашей 64-битной системе. Его размер не зависит от назначенной длины строки.

Ответ 4

firstname[] имеет нулевое завершение, которое добавляет 1 к длине.

sizeof(lastname) задает размер указателя вместо фактического значения.

Ответ 5

firstname - массив из 6 chars, включая завершающий символ '\0' в конце строки. Поэтому sizeof firstname равно 6.

lastname является указателем на char и будет иметь любой размер, указанный в вашей системе указателем. Типичные значения: 4 и 8. Размер lastname будет таким же, независимо от того, на что он указывает (или даже если он вообще ничего не указывает).