Skip to content

细谈 C 之 sizeof

ANSI C 对 sizeof 的定义 (6.5.3.4 The sizeof operator):

限制 ( Constrains )

1,sizeof 不能作用在以下类型上:

  • 函数类型
  • 未完成类型
  • 位成员

语法 ( Semantics )

2,sizeof 的结果是操作数的字节数大小,类型为无符号整型。

  • 如果数组长度可变,那么会评估它的大小;
  • 如果数组长度固定则返回一个常数;

3,具体的说:

  • 如果是 char, unsigned char signed char 则返回 1;
  • 如果数组长度固定则返回数组的字节大小;
  • 如果是结构体或者共用体则结果就是这个类型实例的总大小;

举几个例子:

32 bit 系统上:

  • sizeof (char) -> 1;
  • int a[2]; sizeof (a) -> 8;

4,sizeof 的返回结果由具体编译器实现,类型是 size_t ,见 <stddef.h>

5,用法1:分配空间

extern void *alloc(size_t);

double *dp = alloc(sizeof *dp);

6,用法2:计算数组元素个数

sizeof array / sizeof array[0]

7,用法3:可变长数组大小计算

#include <stddef.h>

size_t fsize3(int n)
{
        char b[n+3];

        return sizeof b; // 运行时 sizeof
}

8,注意:指针形式参数

当作用在形式参数上,且这个形式参数为数组或者指针类型,则 sizeof 返回的是指针的大小。

size_t func(char a[])
{
        return sizeof(a); //  return 4
}

int main(void)
{
        char a[222];

        func(a); // 4
        return 0;
}

9,作用在数值上

sizeof(20) // 4

当作一个 int 类型处理

实现

那 sizeof 是如何实现的呢?编译时?运行时?

1,编译时

编译时的 sizeof 无非就是通过简单的计算方法把对象的大小计算出来,请写出代码?

2,运行时

用法3 中我们知道,sizeof 作用在可变数组大小上需要运行时评估大小,怎么实现的呢?

Post a Comment

Your email is never published nor shared. Required fields are marked *