You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数中含字符数组的结构体大小为何不同?内部原理解析

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:10:12