Неожиданные результаты для "sizeof" строк - PullRequest
3 голосов
/ 28 марта 2011

Почему sizeof в следующих случаях печатает разные значения:

printf("%d",sizeof("ab")); //print 3

char* t="ab";
printf("%d",sizeof(t)); //print 4

В первом случае у меня 2 символа ... Разве не sizeof печатать 2? Потому что они 2 байта?

Ответы [ 5 ]

7 голосов
/ 28 марта 2011

t - указатель на массив, содержащий "ab".Его размер равен размеру указателя.

"ab" - массив, содержащий "ab".Его размер равен размеру этого массива, который равен трем символам, поскольку необходимо учитывать нулевой терминатор.

Массивы не являются указателями.

7 голосов
/ 28 марта 2011

Строки в Си заканчиваются нулем.

"ab" в памяти выглядит как 'a' 'b' '\0'

В то время как t является указателем, поэтому размер равен 4.

3 голосов
/ 28 марта 2011

Тип строкового литерала "ab" равен const char(&)[3].
То есть sizeof("ab") = sizeof(const char(&)[3]) = sizeof(char) * 3, что на вашем компьютере равно 3.

А в другом случае t - это просто указатель.
То есть sizeof(t) = sizeof(void*), что составляет 4 байта на вашем компьютере.

-

Примечание:

Если вы добавите "ab" к L и сделаете его L"ab", тогда

тип строкового литерала L"ab" будет const wchar_t(&)[3].
Такsizeof(L"ab") = sizeof(const wchar_t(&)[3]) = sizeof(wchar_t) * 3 что равно 12 для ideone:

http://ideone.com/IT7aR

Так как * sizeof(wchar_t) = 4 для ideone, который использует GCC для компиляции!

3 голосов
/ 28 марта 2011

Строковый литерал - это массив символов, а не символ *.

char a[] = "ab";
char * t = a;
printf("%d",sizeof(a)); //print 3
printf("%d",sizeof(t)); //print 4
3 голосов
/ 28 марта 2011

Потому что в первом случае вы запрашиваете размер массива. Второй раз вы запрашиваете размер указателя.

...