考虑到类型A
定义如下:
typedef struct a { const int a; } A;
我知道此代码是有效的:
A * foo = malloc(sizeof *foo); // Allocates uninitialized memory with no effective type
memcpy(foo, &(typeof(*foo)){ .a = 42, }, sizeof *foo); // Effectively initialize the value once
(参见https://stackoverflow.com/a/79012045/13242312)
但是,如果我们希望值位于堆栈而不是堆中,alloca
那么使用 而不是是否仍然有效?malloc
用例:我希望函数中有一个返回路径,因此我想在函数范围内定义结果变量
A A_new(void) {
A * a = alloca(sizeof *a);
if (/* something */) {
memcpy(a, &(typeof(*a)){.a = 1}, sizeof *a);
} else {
memcpy(a, &(typeof(*a)){.a = 2}, sizeof *a);
}
return *a;
}
与 Alloca 没有区别
是否使用
alloca
或malloc
对相关语义没有影响,除非它alloca
不是标准 C 库函数。无需担心类型
通过在准备内存时不使用目标类型,可以避免语义问题
const
。例如:T
语句中以类型形式访问内存是由 C 标准定义的,因为通过将对象的字节复制到内存中,return
内存已被赋予有效类型,因此可以使用其有效类型进行访问。T
T
无需分配
您的示例代码并未说明需要使用动态分配,无论是从
malloc
还是alloca
。整个函数体可能只是:我意识到示例代码可能过于简化,因此原始代码中可能不仅仅
.a = something ? 1 : 2
需要 。但是,仍然可以通过将成员值记录在其自己的对象或没有成员的并行结构中来避免动态分配const
,例如: