C 调用vfprintf函数后出现分段错误(堆芯转储)
这是密码C 调用vfprintf函数后出现分段错误(堆芯转储),c,segmentation-fault,C,Segmentation Fault,这是密码 static FILE *flLog = nullptr; const char logFilename[] = "log.txt"; void logprintf ( const char *fmt, ... ) { if ( flLog == nullptr ) { flLog = fopen(logFilename, "a" ); if ( flLog == nullptr ) return; }
static FILE *flLog = nullptr;
const char logFilename[] = "log.txt";
void logprintf ( const char *fmt, ... ) {
if ( flLog == nullptr ) {
flLog = fopen(logFilename, "a" );
if ( flLog == nullptr )
return;
}
time_t rawTime;
struct tm * timeInfo;
time ( &rawTime );
timeInfo = localtime ( &rawTime );
fprintf( flLog, "[%d-%d-%d %02d:%02d:%02d] ",
timeInfo->tm_year, timeInfo->tm_mon, timeInfo->tm_mday,
timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec);
va_list ap;
va_start( ap, fmt );
vprintf( fmt, ap );
vfprintf( flLog, fmt, ap );
va_end( ap );
fprintf( flLog, "\n" );
printf( "\n" );
fflush( flLog );
}
我就是不知道这有什么问题。这个函数很奇怪,当它提供了2个参数时,它工作得很好,但当它提供了3个或更多参数时,它会出现分段错误
在我的项目中,有一个地方被称为:
logprintf("Security warning: %s tried to give a invalid VUA (%s).\n", ip, vua);
调用后,我得到以下输出:
[1] 9770 segmentation fault (core dumped) ./build/apps/server
将va_列表传递给函数后,必须使用va_end。本标准规范的前言说明:
对象ap可以作为参数传递给另一个函数;如果该函数调用带有参数ap的va_arg宏,则调用函数中ap的值是不确定的,应在进一步引用ap.253之前传递给va_end宏
253允许创建指向va_列表的指针并将该指针传递给另一个函数,在这种情况下,在另一个函数返回后,原始函数可以进一步使用原始列表
你有:
va_list ap;
va_start( ap, fmt );
vprintf( fmt, ap );
vfprintf( flLog, fmt, ap );
va_end( ap );
你需要:
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
va_start(ap);
vfprintf(flLog, fmt, ap);
va_end(ap);
将va_列表传递给函数后,必须使用va_end。本标准规范的前言说明:
对象ap可以作为参数传递给另一个函数;如果该函数调用带有参数ap的va_arg宏,则调用函数中ap的值是不确定的,应在进一步引用ap.253之前传递给va_end宏
253允许创建指向va_列表的指针并将该指针传递给另一个函数,在这种情况下,在另一个函数返回后,原始函数可以进一步使用原始列表
你有:
va_list ap;
va_start( ap, fmt );
vprintf( fmt, ap );
vfprintf( flLog, fmt, ap );
va_end( ap );
你需要:
va_list ap;
va_start(ap, fmt);
vprintf(fmt, ap);
va_end(ap);
va_start(ap);
vfprintf(flLog, fmt, ap);
va_end(ap);
使用-g编译并使用valgrind运行。欢迎使用堆栈溢出。请查看我们的,特别注意上的页面。基本上,尽可能简化代码,同时仍能再现错误。有一个很好的机会,你会发现错误的方式,如果不是,你可以张贴什么,使我们的任务更容易。考虑使用StrfTimes来格式化日期/时间到一个字符串。如果代码没有崩溃,您的代码将为2020-01-01年元旦的日期组件打印120-0-1,这不是一种明显的使用格式。使用-g编译并使用valgrind运行。欢迎使用堆栈溢出。请查看我们的,特别注意上的页面。基本上,尽可能简化代码,同时仍能再现错误。有一个很好的机会,你会发现错误的方式,如果不是,你可以张贴什么,使我们的任务更容易。考虑使用StrfTimes来格式化日期/时间到一个字符串。如果代码没有崩溃,那么它将为2020-01-01年元旦的日期组件打印120-0-1,这不是一种明显的格式。