【发布时间】:2015-09-30 08:29:50
【问题描述】:
可以在复合语句中使用 alloca 吗? 示例:
typedef struct
{
size_t len;
char* data;
} string_t;
#define str_to_cstr(str) \
({ \
char* v = alloca(str.len + 1); \
v[len] = 0; \
memcpy(v, str.data, str.len); \
})
// ... and somewhere in deep space
int main()
{
string_t s = {4, "test"};
printf("%s\n", str_to_cstr(s));
return 0;
}
根据我的经验,它运作良好,但我不确定它是否安全。 顺便说一句,它是用 gcc 4.8.4 编译的
【问题讨论】:
-
... 或者,
memcpy(v, str.data, str.len+1); -
虽然您的建议应该可行,但为什么不在
.data的末尾保留一个空字符并使用它(可能转换为const char *)? -
虽然没关系,但您应该考虑使用variable length array (VLA)。它们是随 C99 引入的。
-
为什么使用宏而不是
inline函数?该宏会破坏您的代码并不必要地使用 gcc 扩展。 -
是的,我知道 VLA,但我试图找到“单行解决方案”。内联在这里不适合,因为 alloca 使用调用 alloca 的函数堆栈