sizeof运算符

来自cppreference.com
< c‎ | language

查询对象或类型的大小

在必须知道对象实际大小时使用

目录

[编辑] 语法

sizeof( type ) (1)
sizeof expression (2)

两个版本都返回size_t类型的值。

[编辑] 解释

1) 以字节数返回type类型对象表示的大小
2) 以字节数返回expression的类型对象表示的大小

[编辑] 注意

取决于计算机架构,字节可能由8或更多位构成,准确数字为CHAR_BIT所提供。

sizeof(char)sizeof(signed char)以及sizeof(unsigned char)始终返回1

sizeof不能用于函数类型、不完整类型(含void)或位域左值。

当将此运算符作用于结构体联合体类型的运算数时,结果是这种对象的总字节数,包含中部及尾随的填充。之所以有尾随填充,是因为倘若对象为数组元素,则此数组的下一个元素应该满足对齐要求。换言之sizeof(T)返回T[]数组的一个元素大小。

除去expression类型为VLA的情况, (C99 起)expression不会被求值,而且sizeof运算符可以用于整数常量表达式

expression的类型是变量长度数组类型,则expression会被求值,且数组的大小会在运行时计算。 (C99 起)

任何数组a含VLA (C99 起))的元素数目可以由表达式sizeof a / sizeof a[0]确定。注意若a拥有指针类型(譬如函数参数调整的指针至数组转换之后),此表达式会简单地将指针类型的字节数除以所指向类型的字节数。

[编辑] 关键词

sizeof

[编辑] 示例

示例输出对应拥有64位指针和32位int的平台

#include <stdio.h>
 
int main(void)
{
    // 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))); // 错误:函数类型
//  printf("sizeof(char[]) = %zu\n", sizeof(char[])); // 错误:不完整类型
 
    // expression argument:
    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]
}

可能的输出:

sizeof(float)         = 4
sizeof(void(*)(void)) = 8
sizeof(char[10])      = 10
sizeof 'a'   = 4
sizeof &main = 8
sizeof "hello" = 6

[编辑] 参考

  • C11 standard (ISO/IEC 9899:2011):
  • 6.5.3.4 The sizeof and _Alignof operators (p: 90-91)
  • C99 standard (ISO/IEC 9899:1999):
  • 6.5.3.4 The sizeof operator (p: 80-81)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 3.3.3.4 The sizeof operator

[编辑] 参阅

sizeof运算符C++ 文档