gcc在Debian中的奇怪行为

时间:2014-04-21 23:13:14

标签: c linux gcc debian

char * stft (const char *fmt, ...) {

    va_list items;
    char *out;
    int magic = 0; // <-- here magic?

    va_start (items, fmt);
    vsprintf (out, fmt, items);
    va_end (items);

    return out;

}

使用类似:

char *str = stft ("%s-%s %s", a, b, c);

这是有效的解决方案吗? 如果删除未使用的&#34;魔法&#34;变量 - 返回字符串后我有Segmentation fault。 做错了什么?

$ gcc --version gcc(Debian 4.4.5-8)4.4.5

$ uname -a Linux深度站(挤压)2.6.32-5-686#1 SMP Fri 5月10日08:33:48 UTC 2013 i686 GNU / Linux

1 个答案:

答案 0 :(得分:1)

您正在尝试写入未初始化的指针out。这就是你崩溃的原因。这是严重未定义的行为。魔术巧合;它不会使行为更好地定义。

最好使用vsnprintf()

char *out = malloc(256);
...
vsnprintf(out, 256, fmt, items);
...
return out;

或类似的东西。

你可以改善这一点。例如:

char *stft(const char *fmt, ...)
{
    va_list items;

    va_start(items, fmt);
    int length = vsnprintf(0, 0, fmt, items);
    va_end(items);
    char *out = malloc(length+1);
    if (out != 0)
    {
        va_start(items, fmt);
        vsnprintf(out, length+1, fmt, items);
        va_end(items);
    }

    return out;
}

确保在调用代码中释放已分配的内存。