关于C语言中void函数sizeof结果为1的原因咨询
sizeof获取void函数调用的结果是1,而int函数是4? 我在学习C语言时接触到void函数,知道这类函数不返回值但可以包含return语句。我尝试用sizeof运算符获取该函数调用后的大小,结果显示为1;而int类型函数的sizeof结果为4。想请教一下这背后的原因是什么?
测试代码如下:
#include <stdio.h> void my_func() { printf("From void my_function\n"); return ; } int func() { printf("From int func\n"); return 0; } int main() { printf("Size of void function : %lu\n",sizeof(my_func())); // 输出1 printf("Size of integer function : %lu\n",sizeof(func())); // 输出4 return 0; }
解答
这个问题其实涉及到C标准规定和编译器扩展的细节,咱们一步步来理清楚:
先看
int func()的情况:你调用func()得到的是一个int类型的返回值,sizeof(func())本质上就是sizeof(int)。在大多数系统里int类型占4字节,所以输出4,这部分逻辑很直观。再重点说
void my_func()的情况:严格来说,C标准里不允许对void类型的表达式使用sizeof运算符,因为void代表“无类型”,没有具体的大小可言。但像GCC这类常用编译器做了非标准扩展——当你对void类型表达式用sizeof时,它会默认返回1。这个1并不是真的代表某个实际类型的大小,更像是编译器给出的一个“占位值”,用来让这类不符合标准的代码能编译通过(常见于一些奇技淫巧的泛型编程写法)。还有个容易被忽略的细节:你写的
sizeof(my_func())和sizeof(func())里,函数其实根本不会被执行!因为sizeof是编译期运算符,它只需要知道表达式的类型就能计算大小,不会运行表达式本身。不信你运行程序看看,两个函数里的printf其实都不会输出内容~最后要提醒:这种对
void表达式用sizeof的写法是依赖编译器扩展的,并不符合C标准,换个编译器(比如某些严格遵循标准的编译器)可能直接报错,所以实际开发里尽量别这么写。
内容的提问来源于stack exchange,提问作者bhanu krishna bhanu

