Пустая строка ""
имеет тип 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)
.