调用 main 之前的简单 C++ 程序崩溃

Simple C++ Program Crash before main is called

我又要开始编码了,但我在 运行 FreeBSD 11 版本中遇到了这段代码。代码因分段错误而崩溃。

#include <iostream>


int is_array_sorted(int a[], int n)
{
if(n==2 || n==1)
    return 1;
else if(a[n-1]<a[n-2])
    return 0;
is_array_sorted(a,n-1);
}

int main()
{
int a[] = {1,2,3,4} ;
int ret = is_array_sorted(a,4);

std::cout<<"sorted ->"<< ret <<std::endl;
return 0;
}

所以,我使用

构建这个
 c++ file.cpp --std=c++14 -g3

运行 然后崩溃了。

此外,我想通过在主符号处设置断点来使用 gdb 进行调试。然而,它甚至崩溃,给出“程序终止信号 SIGKILL,非法指令。 该程序已不存在。

请帮忙看看我做错了什么?

您的 is_array_sorted 函数原型为 return 和 int,因此这是它在所有代码路径中必须做的事情(a) .

n 为一或两个时,或者当被检查的两个元素顺序不正确时,您会这样做,但当它们顺序正确时 不会

在那种情况下,它会跳转到最后一个语句,并且 不会 return 和 int - 这是最可能的原因是什么导致代码崩溃。

将最后一行更改为:

return is_array_sorted (a, n-1);

然后重试。

顺便说一句,我不太喜欢 if ... return else ... 编程学院,因为它不必要地使代码结构复杂化。

您的逻辑似乎也有一个不正确的案例,当 n 等于二时 returning "true"。传递数组 {5, 4}n 为二,应该会告诉您为什么这是个坏主意。

在我看来,解决这两个问题的更好方法是:

int is_array_sorted (int a[], int n) {
    if (n==1)
        return 1;
    if (a[n-1] < a[n-2])
        return 0;
    return is_array_sorted (a, n-1);
}

(但是,即使您无视我的布局建议,您仍然应该解决 n == 2 问题)。


(a) 根据 C++11 6.6.3 The return statement /2:

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.