C++ 简单C++;程序在调用main之前崩溃
我再次开始编码,但在FreeBSD11版本中运行此代码时遇到了障碍。代码因分段错误而崩溃C++ 简单C++;程序在调用main之前崩溃,c++,debugging,clang++,C++,Debugging,Clang++,我再次开始编码,但在FreeBSD11版本中运行此代码时遇到了障碍。代码因分段错误而崩溃 #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 re
#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;
}
它跑了,然后坠毁了
此外,我还想通过在主符号处设置断点来使用gdb进行调试。然而,它崩溃了,甚至给出了“程序终止信号SIGKILL,非法指令”。
该程序不再存在
请帮助找出我做错了什么?您的
是数组排序的
函数是原型化的,返回int
,因此它在所有代码路径(a)中都必须这样做
当n
是一个或两个时,或者当正在检查的两个元素的顺序不正确时,而不是当它们的顺序正确时,您会这样做
在这种情况下,它直接进入最后一个语句,并且不返回int
——这是导致代码崩溃的最可能原因
将最后一行更改为:
return is_array_sorted (a, n-1);
然后再试一次
顺便说一句,我不是编程学派的忠实粉丝,因为它不必要地使代码结构复杂化了
逻辑中的大小写似乎也不正确,当n
等于2时返回“true”。传递数组{5,4}
,其中n
为2,应该会告诉您为什么这是个坏主意
在我看来,解决这两个问题的更好方法是:
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);
}
int是数组排序的(inta[],intn){
如果(n==1)
返回1;
if(a[n-1]
(但是,即使您无视我的布局建议,您仍然应该解决n==2
问题)
(a) 根据
C++11 6.6.3返回语句/2
:
从函数的末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为
中的最后一个语句是\u array\u sorted
没有返回任何内容->未定义的行为。谢谢您的回答!我需要修改基本内容:(仍然奇怪的是,在调用is\u array\u sorted
之前,调试器甚至无法启动main
函数。OP的代码中没有静态全局对象或任何可疑的东西。GCC为什么会生成这样的二进制文件?@Christian,这就是未定义行为的问题,即standard对可能发生的事情没有限制。格式化磁盘并播放某人的AVI文件是完全有效的:-)@paxdiablo:或者只是生成一个二进制文件,在调用中断函数时会崩溃。我不认为GCC通常不会仅仅因为在整个程序的某个地方有一个UB实例而不让调试器到达main
。也许在这种情况下是因为main
本身调用了中断函数。
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);
}