Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以下代码在64位系统中崩溃_C - Fatal编程技术网

C 以下代码在64位系统中崩溃

C 以下代码在64位系统中崩溃,c,C,以下程序在64位系统中崩溃。此代码在32位系统中运行良好 我使用的是centOS 32位和centOS 64位系统。。 原因是什么 #if 1 if (1) { memset(message1, '\0', sizeof(message1)); vsprintf(message1, format, vAList); } #endif if (1) { //PROGRAM CRASHES in the following line IF AM PUTTING #if 1 in th

以下程序在64位系统中崩溃。此代码在32位系统中运行良好 我使用的是centOS 32位和centOS 64位系统。。 原因是什么

#if 1
if (1) 
{
  memset(message1, '\0', sizeof(message1));
  vsprintf(message1, format, vAList);
}
#endif

if (1)
{
  //PROGRAM CRASHES in the following line IF AM PUTTING #if 1 in the above code as i did
  val = vfprintf(logFile, format,vAList);
}
当程序达到
val=vfprintf(日志文件、格式、有效性)时


在这里,它在64位系统中崩溃。

可变参数列表不能使用两次
vfprintf
“用完”参数,下一个调用可能会尝试访问列表后的内存。在手册页的文字中:

这些函数[
v*printf
]不调用
va_end
宏。因此,ap的值在呼叫后未定义。应用程序应该在之后调用
va_end(ap)
自身

如果您的格式需要取消引用,如
%s
格式,则程序很可能会崩溃

您可以通过两种方式解决这个问题:或者将对
vfprintf
的所有调用包装在它们自己的
va_start
va_end
中:

int f(const char *fmt, ...)
{
    va_list va;

    va_start(va, fmt);
    vprintf(fmt, va);
    va_end(va);

    va_start(va, fmt);
    vprintf(fmt, va);
    va_end(va);

    return 0;
}
或复制可变变量列表:

int f(const char *fmt, ...)
{
    va_list va, vb;

    va_start(va, fmt);
    va_copy(vb, va);

    vprintf(fmt, va);
    vprintf(fmt, vb);

    va_end(va);
    va_end(vb);

    return 0;
}
(必须在使用从中复制的列表之前进行复制。)


Edit:在第二个示例中,忘记清理复制的va lis,
vb
。现已修复。

请分享您在调试此问题时学到的知识,例如崩溃发生的位置以及崩溃点的变量值。编译器是否生成任何警告?将它们添加到问题中或首先解决它们。我已更新了我的问题。请尝试至少提供调试器的回溯(在发生崩溃时,请在
gdb
中简单键入
bt
)。等等,此代码与您最初发布的代码完全不同。难怪没人能看到这个问题!为什么这不是32位的崩溃?巧合-你很幸运。(它不崩溃的事实并不一定意味着它是正确的。)