C 以下代码在64位系统中崩溃
以下程序在64位系统中崩溃。此代码在32位系统中运行良好 我使用的是centOS 32位和centOS 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
#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位的崩溃?巧合-你很幸运。(它不崩溃的事实并不一定意味着它是正确的。)