是否可以在复合语句中使用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;
}
根据我的经验,它运作良好,但我不确定它是否安全。 BTW,用gcc 4.8.4编译
答案 0 :(得分:3)
此示例中不安全:
printf("%s\n", str_to_cstr(s));
来自alloca的glibc documentation:
不要在函数调用的参数中使用alloca - 您将得到不可预测的结果,因为alloca的堆栈空间将出现在函数参数的空间中间的堆栈中。要避免的一个例子是foo(x,alloca(4),y)。
请注意,({})
不是复合语句,而是GNU C statement expression 。