我再次开始编码,但我在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,非法指令。 该计划已不复存在。
请帮忙搞清楚我做错了什么?
答案 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
:
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。