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,这不是一种明显的格式。