C语言 调用 vfprintf 函数后出现分段错误(核心转储)



这是代码

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);

相关内容

  • 没有找到相关文章