1

複合ステートメント内で 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でコンパイルされました

4

1 に答える 1

3

ここの例では安全ではありません:

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

alloca のglibcドキュメントから:

関数呼び出しの引数内で alloca を使用しないでください。alloca のスタック領域が関数引数の領域の途中でスタックに表示されるため、予測できない結果が得られます。避けるべきものの例は foo (x, alloca (4), y) です。

は複合文({})ではなく、GNU C文の式であることに注意してください。

于 2015-07-11T18:26:44.373 に答える