sizeof operator
查询对象或类型的大小。
当需要知道对象的实际大小时使用。
目录 |
语法
sizeof(
类型
)
|
(1) | ||||||||
sizeof
表达式
|
(2) | ||||||||
两个版本都返回类型为 size_t 的值。
说明
注释
根据计算机架构的不同,一个 字节 可能由8位或更多位组成,具体数值由 CHAR_BIT 提供。
sizeof ( char ) 、 sizeof ( signed char ) 和 sizeof ( unsigned char ) 始终返回 1 。
sizeof 不能用于函数类型、不完整类型(包括 void )或 位域 左值。
当应用于具有 结构体 或 联合体 类型的操作数时,结果是该对象的总字节数,包括内部和尾部填充。尾部填充的设置使得如果该对象是数组的一个元素,则能满足该数组下一个元素的对齐要求,换句话说, sizeof ( T ) 返回的是 T [ ] 数组元素的大小。
|
若
type
是
VLA
类型,且更改其大小表达式的值不会影响
|
(since C99) |
除非
expression
的类型是
VLA
,
(C99 起)
expression
不会被求值,且
sizeof
运算符可用于整型
常量表达式
。
|
如果 expression 的类型是 可变长度数组 类型,则会在运行时计算 expression 并确定其所求值数组的大小。 |
(since C99) |
任何 数组 a 包括VLA (since C99) 中的元素数量可以通过表达式 sizeof a / sizeof a [ 0 ] 来确定。需要注意的是,如果 a 具有指针类型(例如在数组到指针转换或函数参数类型调整后),该表达式将仅计算指针类型字节数与所指向类型字节数的比值。
关键词
示例
示例输出对应具有64位指针和32位int的平台
#include <stdio.h> int main(void) { short x; // 类型参数: 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))); // 错误:函数类型 // printf("sizeof(char[]) = %zu\n", sizeof(char[])); // 错误:不完整类型 // 表达式参数: printf("sizeof 'a' = %zu\n", sizeof 'a'); // 'a'的类型是int // printf("sizeof main = %zu\n", sizeof main); // 错误:函数类型 printf("sizeof &main = %zu\n", sizeof &main); printf("sizeof \"hello\" = %zu\n", sizeof "hello"); // 类型是char[6] printf("sizeof x = %zu\n", sizeof x); // x的类型是short printf("sizeof (x+1) = %zu\n", sizeof(x + 1)); // x+1的类型是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 运算符 (页: 待定)
- C17 标准 (ISO/IEC 9899:2018):
-
- 6.5.3.4 sizeof 和 _Alignof 运算符 (页: 待定)
- 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
运算符
|