Оператор sizeof
Запрашивает размер объекта или типа.
Используется, когда необходимо узнать фактический размер объекта.
Синтаксис
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), и изменение значения выражения его размера не повлияет на результат |
(с C99) |
За исключением случая, когда тип выражение является типом VLA,(с C99)выражение не вычисляется, и оператор sizeof может использоваться в целочисленном константном выражении.
|
Если тип выражения является типом массива переменной длины, выражение вычисляется, и размер массива, к которому оно относится, вычисляется во время выполнения. |
(с C99) |
Число элементов в любом массиве a включая VLA(с C99) может быть определено с помощью выражения sizeof a / sizeof a[0]. Обратите внимание, что если a имеет тип указателя (например, после преобразования массива в указатель для корректировки типа параметра функции), это выражение просто разделит количество байтов в типе указателя на количество байтов в типе, на который указывает указатель.
Ключевые слова
Пример
Выходные данные соответствуют платформе с 64-битными указателями и 32-битными целыми числами
#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:2023):
- 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 оператора |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/sizeof