почему sizeof ("") эквивалентен 1, а sizeof (NULL) эквивалентен 4 в языке c? - PullRequest
9 голосов
/ 10 ноября 2010

почему sizeof("") эквивалентно 1, а sizeof(NULL) эквивалентно 4 на языке c?

Ответы [ 5 ]

20 голосов
/ 10 ноября 2010

Строковый литерал представляет собой массив символов * (со статическим хранилищем), который содержит все символы в литерале вместе с терминатором.Размер массива - это размер элемента, умноженный на количество элементов в массиве.

Литерал "" - это массив, состоящий из одного char со значением 0.Тип char[1], а sizeof(char) всегда один;следовательно, sizeof(char[1]) всегда равен единице.

В C NULL определяется реализацией и часто ((void*)0).Размер void*, в вашей конкретной реализации , равен 4. Это может быть другое число в зависимости от платформы, на которой вы работаете.NULL может также расшириться до целого числа некоторого типа значения 0, и вместо этого вы получите его размер.

* Литерал не является указателем, массивы не являются указателями, указатели неиграть роль в этой части вопроса.

12 голосов
/ 10 ноября 2010

Пустая строка "" имеет тип char[1] или "массив 1 из char".Это , а не указатель, как считают большинство людей.Он может затухать в указатель, поэтому каждый раз, когда ожидается указатель на char, вы можете использовать вместо него массив char, и этот массив превратится в указатель на его первый элемент.

Поскольку sizeof(char) равно 1 (по определению), поэтому у нас sizeof("") равно sizeof(char[1]), что равно 1 * 1 = 1.

В C * NULL означает "определяемая реализацией константа нулевого указателя "(C99 §7.17.3).«Константа нулевого указателя» определяется как целочисленное выражение со значением 0 или такое выражение, приведенное к типу void * (C99 §6.3.2.3.3).Таким образом, фактическое значение sizeof(NULL) определяется реализацией: вы можете получить sizeof(int) или sizeof(void*).В 64-битных системах у вас часто есть sizeof(int) == 4 и sizeof(void*) == 8, что означает , вы не можете зависеть от того, что sizeof(NULL) является .

Также обратите внимание, что большинство реализаций C определяютNULL как ((void*)0) (хотя это не требуется стандартом), тогда как большинство реализаций C ++ просто определяют NULL как обычный 0. Это означает, что значение sizeof(NULL) может и будет меняться в зависимости от того, скомпилирован ли код как C или как C ++ (например, код в заголовочных файлах, совместно используемых исходными файлами C и C ++).Так что не зависит от sizeof(NULL).

5 голосов
/ 10 ноября 2010

NULL в C определяется как (void *) 0. Поскольку это указатель, для его хранения требуется 4 байта. И "" равен 1 байту, потому что эта "пустая" строка имеет символ EOL ('\ 0').

2 голосов
/ 10 ноября 2010

sizeof (NULL) - это не что иное, как указатель на адрес 0, а указатель в 32-битной системе занимает 4 байта.

0 голосов
/ 10 ноября 2010

"" -> Cstrings завершаются по соглашению с нулевым символом x'00, поэтому литерал "" состоит из одного символа x'00 'и имеет sie 1 байт.

По умолчанию NULLнулевой указатель, который на отдельных 32-битных компьютерах имеет размер четыре байта на разных платформах, он может составлять 1,2,3,4,6 или 8. Может быть, даже 5 или 7, но я никогда не сталкивался с 40-битным или 56-битнымадресации.Кроме того, в некоторых старых архитектурах могут быть дополнительные биты, связанные с указателем для указания данных в сравнении с инструкцией или в буфере устройства и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...