myfreax

C语言教程:sizeof 运算符

sizeof 运算符返回指定变量或数据类型在内存中占用的字节大小 。这在不同的系统上可能有所不同,除了 char 和它的变体,始终为 1 个字节

2 min read
By myfreax
C语言教程:sizeof 运算符
C语言教程:sizeof 运算符

sizeof 运算符返回指定变量或数据类型在内存中占用的字节大小 。这在不同的系统上可能有所不同,除了 char 和它的变体,始终为 1 个字节。

由于 sizeof 计算存储类型所需的字节数,因此您可能认为 sizeof 会返回一个 int 或者大小不能为负的整数,也许是一个 unsigned

但事实证明 C 有一种类型来表示 sizeof 的返回值。它是 size_t 发音为 “ size tee ”。它是一个无符号整数类型 unsigned int,可以保存 sizeof 返回的任何值。

您可以使用 sizeof 确定变量或表达式所占内存的字节大小:

int a = 999;

// %zu 是类型 size_t 的格式化占位符

printf("%zu\n", sizeof a);      // Prints 4 on my system
printf("%zu\n", sizeof(2 + 7)); // Prints 4 on my system
printf("%zu\n", sizeof 3.14);   // Prints 8 on my system

请记住 sizeof 运算符返回的是表达式类型的大小 ,而不是表达式本身的大小。这就是为什么 2+7 的大小与 a 的大小相同,因为它们都是 int 类型。

您也可以使用 sizeof 直接计算数据类型占用内存的字节大小。有一点值得注意的是,与表达式不同,类型名称周围需要括号:

printf("%zu\n", sizeof(int));   // Prints 4 on my system
printf("%zu\n", sizeof(char));  // Prints 1 on all systems

sizeof 计算数组大小

更重要的是,sizeof 是一个编译时操作。表达式的结果完全在编译时确定,而不是在运行时确定。

当数组是函数的参数时, sizeof 不能正确返回数组的大小的原因。编译器会把数组参数当作指针对待, 因而 sizeof 返回的是指针的大小。