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

时间:2016-10-23 05:57:02

标签: c++ debugging clang++

我再次开始编码,但我在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,非法指令。 该计划已不复存在。

请帮忙搞清楚我做错了什么?

1 个答案:

答案 0 :(得分:0)

您的is_array_sorted函数原型化为返回int,因此它必须在所有代码路径(a)中执行。

n是一个或两个时,或者当被检查的两个元素出现故障时,你会这样做,但不是,当它们按顺序排列时。

在这种情况下,它会进入最终声明,并且不会返回int - 这最有可能导致什么是&#39 ; s崩溃代码。

将最后一行更改为:

return is_array_sorted (a, n-1);

再试一次。

顺便说一句,我并不是if ... return else ...编程学校的忠实粉丝,因为它不必要地使代码结构复杂化。

您的逻辑中似乎也有不正确的情况,返回&#34; true&#34;当n等于2时。传递数组{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

  

离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。