Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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++ 为什么参数值在嵌套调用中发生变化并导致分段错误_C++_Visual Studio_Segmentation Fault_Android Ndk_Porting - Fatal编程技术网

C++ 为什么参数值在嵌套调用中发生变化并导致分段错误

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(

我有一个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(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对显示有何解释?我是否应该提出另一个问题?