У меня есть код C:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
Он возвращает
20 8
Мне интересно, как получается 8, спасибо!
У меня есть код C:
char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;
Он возвращает
20 8
Мне интересно, как получается 8, спасибо!
sizeof(s1)
- размер массива в памяти, в вашем случае 20 символов, каждый из которых равен 1 байту, равен 20.
sizeof(s)
- размер указателя. На разных машинах он может быть другого размера. По моему это 4.
Чтобы протестировать различные типы размеров на вашем компьютере, вы можете просто передать тип вместо переменной типа printf("%zu %zu\n", sizeof(char*), sizeof(char[20]));
.
Он напечатает 4
и 20
соответственно на 32-битной машине.
sizeof(char *)
- размер указателя, поэтому обычно 4 для 32-разрядной машины и 8 для 64-разрядной машины.
sizeof
массив, с другой стороны, выводит размер массива, в этом случае 20 * sizeof (char) = 20
Еще одна вещь, вы должны использовать тип %zu
для size_t
в формате printf
.
printf("%zu %zu\n", sizeof(s1), sizeof(s));
8 - размер указателя, адрес. На 64-битной машине оно имеет 8 байтов.
Оператор sizeof
возвращает размер типа. Операндом sizeof
может быть либо имя в скобках типа или выражения, но в любом случае размер определяется только типом операнда.
sizeof s1
, таким образом, строго эквивалентен sizeof (char[20])
и возвращает 20.
sizeof s
строго эквивалентен sizeof (char*)
и возвращает размер указателя на char
(в вашем случае 64 бита).
Если вы хотите, чтобы длина C-строки была указана с помощью s
, вы можете использовать strlen(s)
.
Если вы находитесь на 64-битном компьютере, адреса памяти 64 бит, поэтому для представления числовой указательной переменной (char *) должно использоваться числовое значение в 64 бит (8 байтов по 8 бит на байт).
Другими словами, sizeof() работает одинаково для указателей, как для стандартных переменных. Вам просто нужно учесть целевую платформу при использовании указателей.