Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C vsnprintf和strerror:分段故障?_C - Fatal编程技术网

C vsnprintf和strerror:分段故障?

C vsnprintf和strerror:分段故障?,c,C,我的代码如下: #include <stdio.h> #include <stdarg.h> #include <errno.h> int test(const char *fmt, ...); int main(void) { int i; errno = ERANGE; const char *s = "test for vsnprintf"; test("%d,%s", i, stre

我的代码如下:

#include <stdio.h>
#include <stdarg.h>
#include <errno.h>

int test(const char *fmt, ...);


int main(void)
{
        int i;
        errno = ERANGE;
        const char *s = "test for vsnprintf";
        test("%d,%s", i, strerror(errno));
}

int test(const char *fmt, ...)
{
        char buf[512];
        va_list args;
        va_start(args, fmt);
        vsnprintf(buf, sizeof(buf), fmt, args);
        printf("%s\n", buf);
        va_end(args);
}
#包括
#包括
#包括
int测试(常量字符*fmt,…);
内部主(空)
{
int i;
errno=ERANGE;
const char*s=“vsnprintf测试”;
测试(“%d,%s”,i,strerror(errno));
}
整数测试(常量字符*fmt,…)
{
char-buf[512];
va_列表参数;
va_启动(参数、fmt);
vsnprintf(buf、sizeof(buf)、fmt、args);
printf(“%s\n”,buf);
va_端(args);
}

上面的代码抛出了一个分段错误,但是当我将
测试(“%d,%s”,I,strerror(errno))
替换为
测试(“%d,%s”,I,s)
,程序运行良好,这里出了什么问题?

记住读取所有警告,并使用-Wall-Wextra^进行编译。 您忘记包含包含strerror头的“”。 它应该和它一起工作;)。
是的,有时缺少include确实会使代码出错。

您能发布Valgrind的输出吗?请注意,
i
在未初始化的情况下使用,这会导致未定义的行为。它可能会以意想不到的方式破坏程序。这可能不是segfault的原因,但在继续之前应该先修复。您的代码在Mac OS上运行良好。尝试在valgrind和调试器中运行以查明问题。请注意,您确实忘记了从两个函数中分别返回一个值,最好使用
put(buf)
而不是带有%s的printf。如果使用GCC,它会使用put优化printf(“%s\n”,*)。