handle-exceptions: Error while dumping state (probably corrupted stack) segmentation fault

程序编译之后,运行程序出现以下错误:

1造成这种问题的原因有很多。

如:

1.

int a = 5;
int b = 0;
a = a / b;

如果程序代码这样,就会造成上面的错误,因为除数为零,违反了 '/' 运算符的右操作数(即:除数)不能为0的规则。

2.访问不存在的内存地址

在C语言中,segment fault通常是由于指针的错误使用,特别是动态分配,非关联化一个空指针总会出现这种错误,在C中,野指针和悬空指针所指向的内存有可能存在也可能不存在,不能对其进行判断,也不能判断其读写权限。

如:

int *p = NULL;
*p = 0;

结果:

3.访问受系统保护的内存地址

int *p = (int *)0;
*p = 5;

结果:

4.数组下标越界访问

在gcc 3.4.4-3编译器中,对数组的越界访问不会报错,其越出部分的数据会在数组的后面存储,但是其地址是没有在程序中分配的,可能在程序运行中被其他程序占用,导致程序内的数据发生改变,影响程序的运行,因此,对数组我们要规划好其下标。

5.对malloc动态分配内存释放,置空后再次操作

int strcpy_dat()
{
    char* str=(char* )malloc(100);
	if(*str)
	{
		return;	
	}
	strcpy(str,"see you");
	printf("%s\n",str);
	free(str);
	str=NULL;
	strcpy(str,"good");
	return 0;
}

结果:

6.堆栈溢出

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void recursion()
{
	printf("%s%d",__FILE__,__LINE__);
	recursion();
}
int main()
{
	recursion();
	return 0;
}

结果:

在例子中,使用的是无限递归,导致堆栈溢出而导致段错误,实际上,无限递归不一定会导致堆栈溢出,对于优化执行的编译器和代码的确切结构而言,这种情况下,这种代码的行为是未定义的,编译器可以消除他,使用位补调用优化,可能导致没有堆栈使用,也有可能优化将递归转换成迭代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值