Namespaces
Variants

sizeof operator

From cppreference.net

查询对象或类型的大小。

当需要知道对象的实际大小时使用。

目录

语法

sizeof( 类型 ) (1)
sizeof 表达式 (2)

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

说明

1) 返回 type 对象表示 的大小(以字节为单位)
2) 返回 expression 类型之对象表示的字节大小。不会对 expression 应用任何隐式转换。

注释

根据计算机架构的不同,一个 字节 可能由8位或更多位组成,具体数值由 CHAR_BIT 提供。

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

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

当应用于具有 结构体 联合体 类型的操作数时,结果是该对象的总字节数,包括内部和尾部填充。尾部填充的设置使得如果该对象是数组的一个元素,则能满足该数组下一个元素的对齐要求,换句话说, sizeof ( T ) 返回的是 T [ ] 数组元素的大小。

type VLA 类型,且更改其大小表达式的值不会影响 sizeof 的结果,则是否对大小表达式求值是未指定的。

(since C99)

除非 expression 的类型是 VLA (C99 起) expression 不会被求值,且 sizeof 运算符可用于整型 常量表达式

如果 expression 的类型是 可变长度数组 类型,则会在运行时计算 expression 并确定其所求值数组的大小。

(since C99)

任何 数组 a 包括VLA (since C99) 中的元素数量可以通过表达式 sizeof a / sizeof a [ 0 ] 来确定。需要注意的是,如果 a 具有指针类型(例如在数组到指针转换或函数参数类型调整后),该表达式将仅计算指针类型字节数与所指向类型字节数的比值。

关键词

sizeof

示例

示例输出对应具有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 运算符