Ответ 1
firstname
- массив char
, несущий завершающий 0
-терминатор. lastname
- указатель. На 64-битных системных указателях ширина 8 байтов.
У меня есть кусок кода 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 ведет себя по-разному для массива символов и указателя на символ?
Может ли кто-нибудь уточнить?
firstname
- массив char
, несущий завершающий 0
-терминатор. lastname
- указатель. На 64-битных системных указателях ширина 8 байтов.
sizeof
массив - это размер общего массива, в случае "bobby" - 5 символов и один трейлинг \0
, который равен 6.
sizeof
указатель - это размер указателя, который обычно составляет 4 байта в 32-разрядной машине и 8 байтов в 64-разрядной машине.
Размер вашего первого массива - это размер bobby\0
. \0
- символ терминатора, поэтому он равен 6.
Второй размер - это размер указателя, который составляет 8 байт в вашей 64-битной системе. Его размер не зависит от назначенной длины строки.
firstname[]
имеет нулевое завершение, которое добавляет 1 к длине.
sizeof(lastname)
задает размер указателя вместо фактического значения.
firstname
- массив из 6 chars
, включая завершающий символ '\0'
в конце строки. Поэтому sizeof firstname
равно 6.
lastname
является указателем на char
и будет иметь любой размер, указанный в вашей системе указателем. Типичные значения: 4 и 8. Размер lastname
будет таким же, независимо от того, на что он указывает (или даже если он вообще ничего не указывает).