函数中含字符数组的结构体大小为何不同?内部原理解析
#include<stdlib.h> #include<stdio.h> void foo(const int size) { struct bar { char some_arr[size]; }; size_t bar_size = sizeof(struct bar); printf("size: %ld\n", bar_size); } int main() { foo(5); foo(10); return 0; }
运行输出:
size: 5 size: 10
问题解答
结构体大小变化的原因
struct bar的大小每次调用都不同,核心是它包含了**可变长度数组(VLA)**成员:char some_arr[size]。这里的size是函数foo的运行时参数,每次调用传入的值不一样,数组长度就跟着变化,结构体总大小自然不同——char类型占1字节,无内存对齐影响时,结构体大小就等于size的值。
内部实现机制
这是C99标准新增的特性,具体逻辑如下:
- 包含VLA的结构体属于运行时动态确定大小的类型,它的大小不会在编译期固定,要等到函数调用、
size参数值确定后才会计算。 sizeof(struct bar)在这里不再是编译期常量表达式,编译器会将其处理为运行时求值操作,根据当前传入的size计算结构体实际大小。- 如果在函数中定义
struct bar的实例(比如struct bar b;),编译器会在栈上为该实例分配对应大小的空间,函数执行完毕后栈空间会自动释放。
注意:并非所有编译器都默认支持该特性(例如MSVC需要开启特定编译选项),且VLA依赖栈空间,过大的size可能导致栈溢出。
内容的提问来源于stack exchange,提问作者MatErW3len
相关产品推荐
相关产品推荐

