sizeof operator
Определяет размер объекта или типа.
Используется, когда необходимо знать фактический размер объекта.
Содержание |
Синтаксис
sizeof(
тип
)
|
(1) | ||||||||
sizeof
выражение
|
(2) | ||||||||
Обе версии возвращают значение типа size_t .
Объяснение
Примечания
В зависимости от архитектуры компьютера, байт может состоять из 8 или более битов, точное количество указано в CHAR_BIT .
sizeof ( char ) , sizeof ( signed char ) и sizeof ( unsigned char ) всегда возвращают 1 .
sizeof нельзя использовать с типами функций, неполными типами (включая void ), или битовыми полями lvalues.
При применении к операнду, имеющему тип структуры или объединения , результатом является общее количество байтов в таком объекте, включая внутреннее и конечное заполнение. Конечное заполнение организовано так, что если бы объект был элементом массива, требование выравнивания следующего элемента этого массива было бы удовлетворено, другими словами, sizeof ( T ) возвращает размер элемента массива T [ ] .
|
Если
тип
является
VLA
типом и изменение значения его
выражения размера не повлияет на результат
|
(since C99) |
За исключением случая, когда тип
expression
является
VLA
,
(начиная с C99)
expression
не вычисляется, и оператор
sizeof
может использоваться в целочисленном
constant expression
.
|
Если тип expression является массивом переменной длины , expression вычисляется и размер массива, к которому он приводит, рассчитывается во время выполнения. |
(since C99) |
Количество элементов в любом массиве a включая VLA (начиная с C99) может быть определено с помощью выражения sizeof a / sizeof a [ 0 ] . Заметим, что если a имеет тип указателя (например, после преобразования массива в указатель или корректировки типа параметра функции), это выражение просто разделит количество байт в типе указателя на количество байт в указываемом типе.
Ключевые слова
Пример
Пример вывода соответствует платформе с 64-битными указателями и 32-битными int
#include <stdio.h> int main(void) { short x; // type argument: printf("sizeof(float) = %zu\n", sizeof(float)); printf("sizeof(void(*)(void)) = %zu\n", sizeof(void(*)(void))); printf("sizeof(char[10]) = %zu\n", sizeof(char[10])); // printf("sizeof(void(void)) = %zu\n", sizeof(void(void))); // Error: function type // printf("sizeof(char[]) = %zu\n", sizeof(char[])); // Error: incomplete type // expression argument: printf("sizeof 'a' = %zu\n", sizeof 'a'); // type of 'a' is int // printf("sizeof main = %zu\n", sizeof main); // Error: Function type printf("sizeof &main = %zu\n", sizeof &main); printf("sizeof \"hello\" = %zu\n", sizeof "hello"); // type is char[6] printf("sizeof x = %zu\n", sizeof x); // type of x is short printf("sizeof (x+1) = %zu\n", sizeof(x + 1)); // type of x+1 is int }
Возможный вывод:
sizeof(float) = 4 sizeof(void(*)(void)) = 8 sizeof(char[10]) = 10 sizeof 'a' = 4 sizeof &main = 8 sizeof "hello" = 6 sizeof x = 2 sizeof (x+1) = 4
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 6.5.3.4 Операторы sizeof и alignof (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 6.5.3.4 Операторы sizeof и _Alignof (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 6.5.3.4 Операторы sizeof и _Alignof (стр: 90-91)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 6.5.3.4 Оператор sizeof (стр: 80-81)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 3.3.3.4 Оператор sizeof
Смотрите также
|
Документация C++
для
sizeof
оператора
|