Какие аргументы принимает оператор sizeof в C?

[ Оригинальное название относится к 'sizeof function'. ]

Я попробовал это, и все они работали:

char * p;

printf («Размер * p равен% d \ n», sizeof (* p)); // результат = 1
printf («Размер p% d \ n», sizeof (p)); // результат = 4
printf («Размер p% d \ n», sizeof (& p)); // результат = 4

Интересно, почему первый printf равен 1, 2-й и 3-й - 4? Итак, какие аргументы может принять sizeof?

12.10.2009 22:47:28
10 ОТВЕТОВ
РЕШЕНИЕ

Требуется тип.

sizeof(char)всегда один. Сама переменная pявляется указателем, и на вашей платформе она имеет размер 4. Затем вы делаете &p, или указатель на указатель, который также имеет размер 4.

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

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

5
12.10.2009 23:59:15
На самом деле, я уверен, что скобки требуются, когда его операндом является имя типа.
bcat 12.10.2009 22:58:20
Вы не исправили это - вы должны сказать «sizeof (char) всегда один». Вы также можете передавать переменные в sizeof (и тогда вам не нужны скобки). В большинстве случаев sizeof () генерирует константу времени компиляции; Исключением является C99 VLA - массив переменной длины, что означает, что sizeof (arrayname) должен оцениваться во время выполнения.
Jonathan Leffler 12.10.2009 23:43:16
sizeof (char)   = 1
sizeof (void *) = 4

Первый - 1, потому что вы передаете символ. (p указывает на символ) 2-й и 3-й вызовы получают объект char * / void *, поэтому они дают 4.

0
12.10.2009 22:50:47

Потому что вы работаете на 32-битной машине.

*p is a character == 1 byte.
p  is a pointer   == 4 bytes.
&p is an address of a pointer == 4 bytes. Same as char**
2
12.10.2009 22:51:18

Первый ответ говорит, что символ равен 1 байту. (разыменование вашего указателя на фактические данные char)

Второе говорит, что значение указателя является 4-байтовым значением, то есть ячейка памяти представлена ​​4-байтовым значением.

Третий говорит, что адрес указателя является 4-байтовым значением.

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

Приветствия.

0
12.10.2009 22:51:19

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

10
12.10.2009 22:51:40
это хорошая информация, но я не думаю, что это то, что он искал
Tom 12.10.2009 22:54:54
+1 за упоминание, что это (обычно) оператор времени компиляции. В C99 sizeof может использоваться во время выполнения для определения размера динамически размещаемого массива. И есть одна ситуация, когда это недопустимо: выражения типа «функция» (например, «sizeof (main)»).
Jim Lewis 12.10.2009 22:57:27
Вы можете удалить круглые скобки, только если вы берете размер значения. Если вы делаете sizeof(type), то вы должны иметь круглые скобки.
newacct 12.10.2009 23:01:42
Это потому, что один из допустимых операндов для sizeof - это «id типа в скобках» (другой является выражением объекта). Технически, вы применяете sizeof к (type), а не к type. На самом деле это различие без разницы, но sizeof *pбольше не «отбрасывание скобок», а 1 + 2«отбрасывание скобок» (1) + (2). В отличие от вызовов функций, операторы просто не нуждаются в скобках.
Steve Jessop 12.10.2009 23:20:30
Если вы даете sizeof (SomeType), вы должны использовать круглые скобки. Поскольку вы можете использовать скобки с переменными, я просто использую «sizeof (что угодно)», всегда используя скобки; это приводило в бешенство коллегу, который был непреклонен в том, что крайне важно проводить различие между типами переменных и типов - различие, которое я до сих пор считаю бесполезным.
Jonathan Leffler 12.10.2009 23:40:37

sizeofне является функцией; это оператор. Его можно использовать двумя способами: как sizeof(typename)и как sizeof expression. Скобки обязательны при использовании с именем типа. Скобки не нужны, когда операнд является выражением, хотя для ясности многие программисты будут заключать в скобки выражение независимо. Обратите внимание , что в отличие от большинства языков программирования операторов, sizeof expressionникак не оценивать свой аргумент при нормальных условиях, то есть, когда его операнд не является переменной длиной массива C99.

8
12.10.2009 23:48:53
Технически это используется двумя способами: sizeof(typename)и sizeof expression. Конечно, любое выражение может быть заключено в круглые скобки, если вам так хочется, и это часто бывает целесообразно, поскольку никто никогда не помнит приоритет sizeof. sizeof (a) ? 1 : 2, равен 1, как есть sizeof a ? 1 : 2, тогда как sizeof (a ? 1 : 2)есть sizeof int.
Steve Jessop 12.10.2009 23:30:33
Строго говоря, в самой последней спецификации языка C - C99 - можно оценить аргумент sizeof. Он оценивается, когда sizeof используется с массивами переменной длины (VLA).
AnT 12.10.2009 23:31:55
@AndreyT: вы правы в том, что sizeof () может быть вычислена во время выполнения, но аргумент все еще не оценен - ​​только размер аргумента. Это имеет значение для «sizeof (1 / 0.0)»; выражение является двойным значением - и поскольку оно не оценивается, исключения не существует. К счастью, вы не можете разделить массив, поэтому часть VLA не обсуждается.
Jonathan Leffler 12.10.2009 23:46:28
Хорошо, я отредактировал свой ответ, чтобы прояснить проблему со скобками и адрес C99 VLA. Спасибо, ребята!
bcat 12.10.2009 23:50:05
Ну, все зависит от конкретного значения термина «оценивается». Обратите внимание, что сам C99 в 6.5.3.4/2 прямо заявляет, что в случае VLA оценивается аргумент 'sizeof': «[...] Если тип операнда является типом массива переменной длины, операнд оценивается ; иначе, операнд не оценивается [...] "
AnT 13.10.2009 00:06:43

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

В мире Си «байт» такой же, как «символ». Т.е. каждый 'char' равен 1 'байту' по определению. Это значение «байт» не обязательно связано с «байтом» машины в базовом оборудовании. «Байт» AC (то есть «char») может состоять из нескольких машинных «байтов». Однако в C-программе у вас нет доступа к машинным байтам. Все измеряется в C «байтах» (то есть в «chars»), а «sizeof» дает вам размер, измеренный в «chars».

По этим причинам sizeof (char) всегда равен 1 независимо от того, из каких машинных байтов фактически состоит каждый char.

0
12.10.2009 23:06:45
Тем не менее, реализация C, в которой char была бы больше, чем наименьшая адресуемая единица памяти в архитектуре, была бы очень неспортивной, поскольку это ограничило бы ваши возможности низкоуровневого программирования на этой машине.
Steve Jessop 12.10.2009 23:26:25

Операнд sizeofоператора является типом.

Если вы используете sizeof с объектом или значением, вместо него используется его тип.

sizeof 65; /* same as `sizeof (int);` */
sizeof 'X'; /* same as `sizeof (int);` */
sizeof 42.0; /* same as `sizeof (double);` */
float f;
sizeof f; /* same as `sizeof (float);` */
/* etc ... */

Вы можете указать тип непосредственно в операторе sizeof (как в «такой же как» выше). Скобки нужны для «приведения операнда к нужному типу» (как в (int)2.5), а не как синтаксис для sizeofсебя

#include <math.h>
sizeof (12 * log(100)); /* same as `sizeof (double);` */
                        /* without the parenthesis, this would be */
                        /* (sizeof 12) * log(100); */
0
13.10.2009 00:00:00

Также обратите внимание:

sizeof 'a' == 1   // C++ 

но

sizeof 'a' == 4   /* C */ 

(Чтобы быть точным, sizeof 'a' == sizeof (int) в C, как отправлено pmg).

В C «a» повышается до int, прежде чем оно будет вычислено. Одна из немногих несовместимостей между двумя языками.

1
25.10.2010 22:36:59
Size of operator show the size of which data type we used 

#include<stdio.h>
int main()
{
int a;
float b;
char c;
double d;
printf("%d",sizeof(a));
printf("%d",sizeof(a));
printf("%d",sizeof(a));
printf("%d",sizeof(a));
} 
Answer a=4;
b=4;
c=1;
d=8

If you are using 8 bit compiler.
-1
9.06.2013 15:55:41