2015-07-11 40 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