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

使用alloca在栈上初始化带有const成员的结构体是否合法?

使用alloca在栈上初始化带有const成员的结构体是否合法?

咱们先明确前提:假设我们定义了这样一个带const成员的结构体类型A:

typedef struct a { const int a; } A;

之前我们已经确认过,用malloc动态分配内存后初始化的写法是合法的:

A * foo = malloc(sizeof *foo); // 分配未初始化的内存,此时还没有有效类型
memcpy(foo, &(typeof(*foo)){ .a = 42, }, sizeof *foo); // 一次性完成有效初始化

这段代码的逻辑是:malloc出来的内存一开始没有有效类型,通过memcpy把复合字面量的值拷贝进去,相当于给这块内存赋予了A的有效类型,同时完成了const成员的初始化,完全符合标准要求。

那回到问题本身:用alloca在栈上初始化这类结构体合法吗?

其实思路和malloc的情况类似,alloca分配的栈内存同样是未初始化且没有有效类型的。我们可以用同样的memcpy方式来完成初始化:

A * bar = alloca(sizeof *bar);
memcpy(bar, &(typeof(*bar)){ .a = 42, }, sizeof *bar);

这种写法是合法的。因为alloca分配的内存和malloc的内存一样,在被赋予有效类型之前,我们可以通过拷贝的方式来初始化它的const成员——毕竟这是第一次给这块内存设定值,并没有去修改已经初始化的const成员,完全符合C标准对const成员的限制(const成员只是不能被修改,并非不能被初始化)。

不过要特别注意:千万别直接尝试给bar->a赋值,比如bar->a = 42;,这属于修改已经初始化的const成员,是未定义行为,绝对不能这么做。

备注:内容来源于stack exchange,提问作者Fayeure

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 17:34:28