调用 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.
我又要开始编码了,但我在 运行 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.