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”,*)。