一、定义
sizeof是C语言中的运算符,并不是函数,用于在编译时确定类型(直接将大小计算结果嵌入生成的代码中,不会引起运行时开销。)或变量的大小(以字节为单位)。它的结果类型是 ‘size_t’,这是一个定义在 <stddef.h>文件中的无符号整数类型,专门用于表示对象的大小。‘sizeof’ 运算符在C语言中有许多应用,理解其用法对于编写高效和正确的C代码至关重要。
二、用法及其注意事项
1.基本数据类型大小计算
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Size of int: %zu\n", sizeof(int)); // 通常输出4
printf("Size of char: %zu\n", sizeof(char)); // 通常输出1
printf("Size of int: %zu\n", sizeof(float)); // 通常输出8
printf("Size of char: %zu\n", sizeof(double)); // 通常输出8
return 0;
}
注意:数据类型大小并不是固定的,它由操作系统决定的,例如在64位系统中long类型大小为8字节,而在32位系统中long类型大小为4字节。
2.指针大小计算
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr;
printf("Size of pointer: %zu\n", sizeof(ptr)); // 通常输出8(在64位系统上)
return 0;
}
注意:指针大小也并不是固定的,它由操作系统决定的,例如在64位系统中大小为8字节,而在32位系统大小为4字节。
3.变量大小计算
#include <stdio.h>
#include <stdlib.h>
int main()
{
int x;
printf("Size of x: %zu\n", sizeof(x)); // 输出变量x的大小,例如4(如果x是int类型)
}
注意:变量的大小计算,是根据变量类型确定的,如上面的代码,由于变量x为int类型,因此大小为4字节。
4.数组大小计算
#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[10];
printf("Size of array: %zu\n", sizeof(array)); // 输出数组总大小,例如40(10个int,每个int通常4字节)
printf("Size of elements: %zu\n", sizeof(array[0])); // 输出数组元素大小
printf("Number of elements in array: %zu\n", sizeof(array) / sizeof(array[0])); // 计算数组的元素个数
return 0;
}
注意:在用sizeof计算数组大小时,可以用数组名计算,但是数组名作为函数参数进行传递的时候会被隐式转换为指针,这时候在函数内部使用sizeof计算函数名时,得到的并不是数组的大小而是指针的大小,同时可以使用sizeof计算数组元素大小以及数组元素个数。
5.函数大小计算
#include <stdio.h>
#include <stdlib.h>
int f1()
{
return 0;
};
double f2()
{
return 0.0;
};
void f3()
{
};
int main()
{
printf("%d \n", sizeof(f1())); // f1()返回值为int,因此被认为是int
printf("%d \n", sizeof(f2())); // f2()返回值为double,因此被认为是double
//printf("%d \n", sizeof(f3())); // 错误!无法对void类型使用sizeof
//printf("%d \n", sizeof(f1)); // 错误!无法对函数指针使用sizeof
//printf("%d \n", sizeof(*f2)); // *f2,和f2()等价,因为可以看作object,所以括号不是必要的。被认为是double
return 0;
}
注意:函数返回什么类型的数据,就按这个数据类型计算。具体是:sizeof(函数名()),相当于调用这个函数的结果,并计算占用空间大小,注意传入的是函数名()而不是函数名(因为函数名是指针)。
6.结构体和联合体等大小计算
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a;
char b;
} MyType;
int main()
{
printf("Size of MyType: %zu\n", sizeof(MyType));
return 0;
}
注意:结构体的大小可能由于成员的对齐和填充而比各成员大小总和更大,具体的内存对齐的规则可以查看这篇文章: 【C语言】结构体与联合体之间的“爱恨情仇”。