Как работает sizeof() для char * (переменные указателя)?

У меня есть код C:

char s1[20];
char *s = "fyc";
printf("%d %d\n", sizeof(s1), sizeof(s));
return 0;

Он возвращает

20 8

Мне интересно, как получается 8, спасибо!

Ответ 1

sizeof(s1) - размер массива в памяти, в вашем случае 20 символов, каждый из которых равен 1 байту, равен 20.

sizeof(s) - размер указателя. На разных машинах он может быть другого размера. По моему это 4.

Чтобы протестировать различные типы размеров на вашем компьютере, вы можете просто передать тип вместо переменной типа printf("%zu %zu\n", sizeof(char*), sizeof(char[20]));.

Он напечатает 4 и 20 соответственно на 32-битной машине.

Ответ 2

sizeof(char *) - размер указателя, поэтому обычно 4 для 32-разрядной машины и 8 для 64-разрядной машины.

sizeof массив, с другой стороны, выводит размер массива, в этом случае 20 * sizeof (char) = 20

Еще одна вещь, вы должны использовать тип %zu для size_t в формате printf.

printf("%zu %zu\n", sizeof(s1), sizeof(s));

Ответ 3

8 - размер указателя, адрес. На 64-битной машине оно имеет 8 байтов.

Ответ 4

Оператор sizeof возвращает размер типа. Операндом sizeof может быть либо имя в скобках типа или выражения, но в любом случае размер определяется только типом операнда.

sizeof s1, таким образом, строго эквивалентен sizeof (char[20]) и возвращает 20.

sizeof s строго эквивалентен sizeof (char*) и возвращает размер указателя на char (в вашем случае 64 бита).

Если вы хотите, чтобы длина C-строки была указана с помощью s, вы можете использовать strlen(s).

Ответ 5

Если вы находитесь на 64-битном компьютере, адреса памяти 64 бит, поэтому для представления числовой указательной переменной (char *) должно использоваться числовое значение в 64 бит (8 байтов по 8 бит на байт).

Другими словами, sizeof() работает одинаково для указателей, как для стандартных переменных. Вам просто нужно учесть целевую платформу при использовании указателей.