Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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++;程序在调用main之前崩溃_C++_Debugging_Clang++ - Fatal编程技术网

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

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

我再次开始编码,但在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 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);
}