Debian中gcc的奇怪行为

Debian中gcc的奇怪行为,c,linux,gcc,debian,C,Linux,Gcc,Debian,这是有效的解决方案吗? 如果删除未使用的“magic”变量-返回字符串后出现分段错误。 你做错了什么 $gcc—版本 通用条款(Debian 4.4.5-8)4.4.5 $uname-a Linux deep station(squeeze)2.6.32-5-686#1 SMP Fri May 10 08:33:48 UTC 2013 i686 GNU/Linux您试图写入未初始化的指针out。这就是你撞车的原因。这是非常不明确的行为。魔法是巧合;这并不能更好地定义行为 最好使用: 或者类似的东

这是有效的解决方案吗? 如果删除未使用的“magic”变量-返回字符串后出现分段错误。 你做错了什么

$gcc—版本 通用条款(Debian 4.4.5-8)4.4.5

$uname-a
Linux deep station(squeeze)2.6.32-5-686#1 SMP Fri May 10 08:33:48 UTC 2013 i686 GNU/Linux

您试图写入未初始化的指针
out
。这就是你撞车的原因。这是非常不明确的行为。魔法是巧合;这并不能更好地定义行为

最好使用:

或者类似的东西

你可以改进这个。例如:

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

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

与问题无关,但不应该有东西初始化
out
?@guest:与问题无关-问题恰恰是
out
没有初始化,所以会发生崩溃。很好的侦查。谢谢>>>请确保在调用代码中释放分配的内存。免费使用()我需要解决方案并发现奇怪的行为对不起,我不理解你的评论。如果您不希望函数分配内存,那么您有两个选择。更好的选择是传入一个缓冲区(
char*buffer
)及其长度(
size\t buflen
),然后使用它们:
vsnprintf(buffer,buflen,fmt,items)
。更糟糕的选择是
静态字符缓冲区[256]
vsnprintf(缓冲区、sizeof(缓冲区)、fmt、项目)。这存在并发性问题,这意味着您不能调用函数两次,并且在没有显式复制的情况下保留两个格式化字符串。这两个可能都有一个太短的缓冲区。感谢您的解决方案!现在,我只对stft()的单个调用使用全局缓冲区,并通过一个调用为当前stft()上下文重新分配缓冲区长度。多谢!
char *str = stft ("%s-%s %s", a, b, c);
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;
}