2015-07-11 63 views
1

是否有可能在复合语句中使用alloca? 例子: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

'v [len]'typo .. – BLUEPIXY

+0

...无论是,还是'memcpy(v,str.data,str.len + 1);' –

+0

虽然你建议应该工作,为什么不只是维护一个'.data'结尾的空字符并使用它(可能强制转换为'const char *')? – Dmitri

回答

3

在你的例子这里不安全编译:

printf("%s\n", str_to_cstr(s)); 

从ALLOCA的glibc的documentation

不要在函数的参数中使用的alloca调用 - 你将得到不可预知的结果,因为alloca的堆栈空间将出现在函数参数空间中间的堆栈上。要避免的一个例子是foo(x,alloca(4),y)。

注意({})不是复合语句但GNU C statement expression

+0

嗯,我在“man alloca”中发现了相当薄弱的一点: '在许多系统上,alloca()不能用于参数列表 函数调用,因为由alloca() 保留的堆栈空间将出现在函数空间中间的堆栈中 参数' 因此,这是否意味着某些系统允许在参数内部使用alloca? – user939407

+0

@ user939407弱点不在手册页中,而在于你的英语语言技能。 –

+0

@ user939407这意味着你不应该这样做。 – ouah