C++程序 显示运行时异常
程序运行时发生运行时错误。由于这不是编译错误,因此编译将成功完成。在这里,我们将学习如何在C++中处理运行时异常。
这里讨论5种类型的运行时异常:
- 除以零。
- 段错误。
- 大内存分配/大静态内存分配。
- 类型限定符错误。
- 运行时无效内存访问。
让我们开始逐个讨论这些运行时错误。
1. 除以零
当我们将整数值除以零时,就会出现这种类型的错误,称为除以零错误。它也称为浮点异常(SIGFPE)。下面是演示除以零异常的C++程序:
// C++程序演示
//除以零异常
#include <iostream>
using namespace std;
// 主方法
int main()
{
int a = 10;
int res = a / 0;
cout << res;
return 0;
}
输出:
2. 段错误
在下面的代码中,行*(str+1)=’n’试图写入只读内存。下面是演示段错误的C++程序:
// C++程序演示
//段错误
#include <iostream>
using namespace std;
// 主方法
int main()
{
char *str;
// 存储在只读内存部分中
// 的数据段
str = "GeeksforGeeks";
// 试图修改只读
// 内存
*(str + 1) = 'n';
return 0;
}
输出:
3. 大内存分配/大静态内存分配
通常,任何编译器或任何语言都会接受10^8以下的数值。但是为了安全起见,我们通常使用10^7以下的数值。在下面的代码中,数组的大小超过了10^8,因此我们由于大内存分配而出现错误。它也被称为中止信号(SIGABRT)。
下面是演示大内存分配运行时异常的C++程序:
// C++程序演示
//大内存分配运行时异常
#include <iostream>
using namespace std;
// 主方法
int main()
{
int a = 100000000000;
int * arr = new int[a];
return 0;
}
输出:
4. 类型指示符错误
以下代码会产生运行时错误,因为变量“a”被定义为long long int,但在scanf中使用的格式指示符是 %d,这会导致错误。
下面是演示类型指示符错误的C++程序:
// C++程序,演示
// 类型指示符错误
#include <iostream>
using namespace std;
// 主函数
int main()
{
long long int a;
scanf("%d", &a);
return 0;
}
输出:
prog.cpp: 在函数‘int main()’中:
prog.cpp:10:19: 警告:格式‘%d’要求类型为‘int’的参数,但是参数2的类型为‘long long int’[-Wformat=]
scanf(“%d”,&a);
5. 运行时的无效内存访问
在下面的代码中,数组被分配了一个负索引值,这将导致无效内存访问。它将给出一个垃圾值。下面是演示运行时无效内存访问的C++程序:
// C++程序,演示
// 运行时的无效内存访问
#include <iostream>
using namespace std;
int arr[5];
// 主函数
int main()
{
int a = arr[-10];
cout << a;
return 0;
}
输出
281923776