这是代码
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_list
传递给函数后,必须使用va_end()
。<stdarg.h>
标准规范的序言说:
对象
ap
可以作为参数传递给另一个函数;如果该函数使用参数ap
调用va_arg
宏,则调用函数中的ap
值是不确定的,应在进一步引用ap
之前传递给va_end
宏。253(253(允许创建一个指向
va_list
的指针并将该指针传递给另一个函数,在这种情况下,原始函数可以在另一个函数返回后进一步使用原始列表。
你有:
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);