Как работает оператор sizeof в c - PullRequest
3 голосов
/ 14 июня 2011

Я хотел знать, как работает оператор sizeof в C. В приведенном ниже коде я ожидаю получить вывод 1, но получаю 4. Так как p указывает на первое местоположение, а в первом месте находится символ, и его размер должен быть один. 1001 *

main()
{

char a[9]="amit";
int *p=&a;
 printf("%d",sizeof((char *)(*p)));
 }

Ответы [ 4 ]

6 голосов
/ 14 июня 2011

Нет, вы запрашиваете размер символа указатель , который равен 4 в вашей реализации.

Это потому, что вы переводите разыменованный указатель int p на указатель char, а затем запрашиваете его размер.

Разбивка:

sizeof((char *)(*p))
       |       \__/
       |         \_ Dereference p to get an int.
       \___________/
             \_____ Convert that to a char * (size = 4).

Если вы хотите обработать первый символ вашего int (который, в конце концов, является массивом символов, который вы в любом случае произвели), вы должны использовать:

sizeof(*((char*)(p)))

Это указатель int, приведенный обратно к указателю char, и затем разыменовывается.

Взлом , что вниз:

sizeof(*((char *)(p)))
       | \________/
       |         \_ Get a char * from p (an int *)
       \___________/
             \_____ Dereference that to get a char (size = 1).
5 голосов
/ 14 июня 2011

Вы получаете размер результата приведения (char *), который представляет собой символ * с размером 4. Конечно, вы могли бы просто сказать:

 printf( "%d", sizeof(a[0]) );

и возникает вопрос: а почему нет?

1 голос
/ 04 августа 2011

Ответ на поставленный выше вопрос равен 4.
Здесь вы вводите целочисленный указатель на указатель на символ.
Это означает, что теперь целочисленный указатель содержит символы.
Для оператора sizeof по умолчанию используется аргументint.
Когда вы проходите как sizeof((char *)(*p)), тогда он обрабатывается как sizeof('a').Этот символ a повышен до int.Вот почему вы получаете 4.

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

Да, в 32-битной системе фрагмент кода должен показывать размер p, равный 4. На 16-битном он будет отображаться 2 (не очень широко используется в мире приложений в наши дни, но можетиспользуется во встроенном мире на основе требований системы).Вы произвели приведение к символу , это повлияет на представление данных, но не на память, занятую указателем, указывающим на ваши данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...