C++ 为什么参数值在嵌套调用中发生变化并导致分段错误
我有一个Visual Studio项目,我正在将其移植到android。我在函数调用中面临一个分段错误的问题,类似于以下函数:C++ 为什么参数值在嵌套调用中发生变化并导致分段错误,c++,visual-studio,segmentation-fault,android-ndk,porting,C++,Visual Studio,Segmentation Fault,Android Ndk,Porting,我有一个Visual Studio项目,我正在将其移植到android。我在函数调用中面临一个分段错误的问题,类似于以下函数: char* format1(const char* fmt, ...) { char* buf = new char[1030]; va_list ap; va_start(ap, fmt); vsprintf(buf, fmt, ap); va_end(ap); return buf; } char* format2(
char* format1(const char* fmt, ...) {
char* buf = new char[1030];
va_list ap;
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
return buf;
}
char* format2(const char* fmt, ...) {
va_list ap;
va_start(ap, fmt);
char* s = format1(fmt, ap);
va_end(ap);
return s;
}
对函数的调用如下所示:
char* s = format2("%*.*d", 8, 8, 9910153);
关于上述问题,我有几个疑问:
如果我单步浏览gdb中调用“function2”的代码,它会显示:
格式fmt=0x4
为什么会这样
调用“function1”时,gdb显示:
format1 fmt=0x15be30内存中的某个随机值
为什么fmt的价值发生了变化?此外,根据fmt中的值,第二次调用会导致分段错误
如果您能帮助解释上述行为,我们将不胜感激。format1采用可变参数集,而不是VAU列表;您向它传递一个非整数参数,格式字符串需要三个整数参数,因此会出现未定义的行为
应该是这样的:
char* format1(const char* fmt, va_list ap) {
char* buf = new char[1030];
vsprintf(buf, fmt, ap);
return buf;
}
只需将ap作为va_列表传递,或使用va_arg提取它。这并不能回答问题,这就是为什么调试器报告fmt=0x4。vsnprintf的未定义行为不能导致这种情况,因为函数还没有被调用。@RobKennedy:我在回答标题中的问题:为什么会有segfault?我不知道特定的调试器在堆栈损坏的情况下会如何工作。在进入format2时,甚至在进入format1时,都没有发生堆栈损坏。在调用vsnprintf之前不会发生这种情况。@MikeSeymour:谢谢,我忽略了参数定义中的草率复制+粘贴的情况。但gdb的显示确实令人困惑,因为它的显示一直在转移我的注意力!gdb对显示有何解释?我是否应该提出另一个问题?