sizeof不是函数,C语言中sizeof的陷阱

时间:2023-01-30 19:45:33

可能很多初学者可能都认为sizeof是函数,因为它的使用方法和函数很相似,其实不然,sizeof不是函数,它是一个操作符,如果查看任何一本C语言教材中的操作符的优先级表的时候我们都可以看到操作符sizeof的优先级是最高的。它的用法简单,得出的结果是操作数的所占内存的大小,操作数可以是int, char之类的数据类型,或者是变量。但关于sizeof的使用要小心,因为它在编译期就完成了计算,在函数运行期间它已经是一个常数值了。看下面的一个例子:

#include <stdio.h>

int test_sizeof(int test[]);

int main()
{
	int map[] = {1, 2, 3, 4};

	printf("main::sizeof(int) = %d\n", sizeof(int));
	printf("main::sizeof(map) = %d\n", sizeof(map));

	printf("test_sizeof::sizeof(map) = %d\n", test_sizeof(map));

	return 0;
}

int test_sizeof(int test[])
{
	return sizeof(test);
}

这个例子中,我们希望函数test_sizeof返回的值是数组map的大小(字节),如果sizeof的计算是在运行时得到的,那么我们应该可以得到正确的结果,即返回值为16(假设int型占4个字节).但实际上函数运行结果如下:

main::sizeof(int) = 4
main::sizeof(map) = 16
test_sizeof::sizeof(map) = 4

很明显test_sizeof的返回值为4,不是16,说明在计算test数组的大小时,该操作数并不是在main函数中定义的map数组,因为sizeof是编译时就计算出结果,此时的test_sizeof函数只知道test是个int 型的数组,所以它的返回值应该是固定的,而与其参数大小无关。那么test_sizeof函数返回值的大小是多少呢,答案是:与指针的大小相同。因为数组名其实与指针是类似的,所以在编译的计算时它的值应该与指针的大小相同,为4个字节(32位)。


另外,sizeof 不能用在像#include,#if,#define等等这样的预处理指令中,因为此时还没有到编译期,还没有类型名称分析,sizeof也就不能用。