使用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
相关产品推荐
相关产品推荐

