sizeof
дает размер своего операнда. Чтобы понять результаты, которые вы видите, вам нужно понять, что на самом деле есть то, что pass1
, pass2
, pass3
и pass4
.
pass1
представляет собой указатель на символ (т.е. char *
), таким образом sizeof pass1
дает размер указателя (переменную, которая содержит адрес памяти, а не массив). То есть 8
с вашим компилятором. Размер указателя определяется реализацией, поэтому это может дать разные результаты с разными компиляторами. Тот факт, что вы инициализировали pass1
, поэтому он указывает на первый символ строкового литерала "abc"
, не меняет того факта, что pass1
объявлен как указатель, а не массив.
pass2
представляет собой массив инициализирован с помощью буквального "abc"
, который - по соглашению -. Представлено в С использованием массива из четырех символов (три буквы 'a'
до 'c'
, плюс дополнительный символ с нулевым значением ('\0'
)
pass3
также является массив из четырех char
, так как он заявил, что путь char pass3[4] = <etc>
. Если вы сделали char pass3[4] = "abcdef"
, вы по-прежнему считаете, что sizeof pass3
является 4
(и 4 элемента pass3
будет 'a'
к 'd'
(с другой чарой cter 'e'
, 'f'
и '\0'
в строке литерал "abcdef"
не используется для инициализации pass3
).
Поскольку и pass2
, и pass3
являются массивами четырех символов, их размер равен 4 (в общем случае размер массива - это размер элемента массива, умноженный на количество элементов). Стандарт определяет sizeof char
как 1
, а 1*4
имеет значение 4
.
pass4
Инициализировано, используя литературу ""
. Этот строковый литерал представлен с использованием единственного символа со значением '\0'
(и перед ним нет символов, поскольку между двойными кавычками нет). Таким образом, pass4
имеет размер 1
по той же причине, что pass2
имеет размер 4.
'sizeof' дает результат типа' size_t'. Правильный формат 'size_t' -' '% zu" '. –
Это одно из тех времен, когда массивы не являются указателями ... они передаются указателям при передаче в функции, но вы теряете эту информацию о размере ... на самом деле общая парадигма использует это, чтобы найти количество элементов в массиве ... –
[для печати 'size_t' use% zu] (http://stackoverflow.com/q/940087/995714). Использование неверного спецификатора формата вызывает неопределенное поведение. –