2011-06-25 2 views
2
char str[] = " http://www.ibegroup.com/"; 

char *p = str ; 

void Foo (char str[100]){ 

} 

void *p = malloc(100); 

Что за sizeofstr, p, str, p в приведенном выше 4 случая, в свою очередь?интервью вопрос о различном размере указателя под 32-битной архитектуры

Я проверил его под моей машине (которая, кажется, 64-битная) с этими результатами:

25 8 8 8 

Но не понимают причину еще.

ответ

4

sizeof(char[]) возвращает количество байтов в строке, т.е. strlen()+1 для нулевых строк с концевыми C заполняющих весь массив. Arrays don't decay to pointers in sizeof. str - это массив, а строка содержит 25 символов плюс нулевой байт, поэтому sizeof(str) должен быть 26. Вы добавили пробел в значение?

Размер указателя, конечно, всегда определяется только машинной архитектурой, поэтому оба экземпляра p составляют 8 байтов на 64-разрядных архитектурах и 4 байта на 32-разрядных архитектурах.

В аргументах функций массивы do распадаются на указатели, поэтому вы получаете тот же результат, что и для указателя. Поэтому следующие определения эквивалентны:

void foo(char s[42]) {}; 
void foo(char s[100]) {}; 
void foo(char* s) {}; 
+0

@ phihag, в чем смысл аргументов 'In функции, массивы разлагаются на указатели? –

+0

массив ('char []') и указатели ('char *') суть одно и то же, почему относились по-разному? Я ожидаю, что оба значения одинаковы ... –

+0

@Je Rog массивы и указатели ** не ** то же самое. Пожалуйста, следуйте ссылкам на часто задаваемые вопросы C, в этой главе подробно обсуждается эта глава. Короче говоря, массивы становятся (или «распадаются») указателями во всех контекстах * кроме * 'sizeof',' & 'и инициализации массива. – phihag

0

str - это массив из 8-разрядных символов, включая нулевой ограничитель.

p - указатель, который обычно является размером родного слова (32 бит или 64 бит).

Размер, занимаемый указателем, остается постоянным, независимо от размера памяти, на которую он указывает.

EDIT

В C++ аргументы, которые массивы передаются по ссылке (которая внутренне представляет собой указатель типа), именно поэтому второй экземпляр str имеет sizeof 8.

+0

Почему 'sizeof' 2-й' str' не 100, как 1-я 'str'? –

+0

@Je Rog: Поскольку массивы получают «продвигаемые» к указателям, когда они отображаются как аргумент функции. – DarkDust

+0

@DarkDust: продвижение по указателю приводит к потере всей информации о 100, так что все, что может сделать sizeof, относятся к первому нулевому значению, не так ли? – grok12

1

Первым из них является sizeof встроенного массива, который представляет собой количество элементов (24 + null в конце строки).

Вторым является указатель sizeof указателя, который является родным размером слова вашей системы, в вашем случае 64 бит или 8 байтов.

Третий - это sizeof указателя на первый элемент массива, который имеет тот же размер, что и любой другой указатель, размер родного слова вашей системы. Почему указатель на первый элемент массива? Поскольку информация о размере массива теряется при передаче функции, и вместо этого он неявно преобразуется в указатель на первый элемент.

Вторым является указатель sizeof указателя, который имеет тот же размер, что и любой другой указатель.

+0

Педатически говоря, не все указатели обязательно одного размера. – pmg

+0

pmg: Dang, http://stackoverflow.com/questions/1241205/are-all-data-pointers-of-the-same-size-in-one-platform/1241314#1241314. Должен ли я редактировать свой ответ или это выходит за рамки вопроса? – orlp

+0

Я бы отредактировал ответ (lol). Дело в том, что в ответе есть неправильная информация. Я плохо спал ночью, зная, что я ушел (** подтвердил **) [неправильная информация] (http://xkcd.com/386/), висящей вокруг. – pmg

-1

в случаях размер

char str[] = “ http://www.ibegroup.com/” 

, как известно, 25 (24 + 1), потому что много памяти на самом деле выделяется.

В случае

void Foo (char str[100]){ 

без памяти выделяется

Смежные вопросы