Интервью по поводу разного размера указателя в 32-битной архитектуре - PullRequest
2 голосов
/ 25 июня 2011
char str[] = " http://www.ibegroup.com/";

char *p = str ;

void Foo ( char str[100]){

}

void *p = malloc( 100 );

Что за sizeof str, p, str, p в приведенном выше случае 4 по очереди?

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

25 8 8 8

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

Ответы [ 4 ]

4 голосов
/ 25 июня 2011

sizeof(char[]) возвращает количество байтов в строке, т. Е. strlen()+1 для строк C с нулевым символом в конце, заполняющих весь массив. Массивы не распадаются на указатели в 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) {};
1 голос
/ 25 июня 2011

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

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

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

Четвертый - это sizeof указателя, размер которого совпадает с любым другим указателем.

0 голосов
/ 25 июня 2011

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

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

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

В случае

void Foo ( char str[100]){

память не выделена

0 голосов
/ 25 июня 2011

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

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

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

EDIT

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

...