linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是啥问题

fscan的问题

主要有以下几个方面的原因:

一、内存访问出错

这类问题的典型代表就是数组越界。

二、非法内存访问

出现这类问题主要是程序试图访问内核段内存而产生的错误。

三、栈溢出

Linux默认给一个进程分配的栈空间大小为8M。c++申请变量时,new操作申请的变量在堆中,其他变量一般在存储在栈中。

因此如果数组开的过大变会出现这种问题。

扩展资料:

注意事项

段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。

一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。在编程中基本是是错误地使用指针引起的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-04-27

出现此问题的原因如下:

1、内存访问错误

这种问题的典型代表是数组越界。

2、非法内存访问

这种问题主要是由程序尝试访问内核段内存的错误引起的。

3、堆栈溢出

默认情况下,Linux为进程分配8M的堆栈空间。 当C ++申请变量时,新申请的变量在堆中,而其他变量通常存储在堆栈中。

因此,如果数组太大,则会出现此问题。

扩展资料:

段故障通常意味着访问的内存超出了系统为程序分配的内存空间。 通常,此值由gdtr存储,是一个48位寄存器,其轨道中的32位由其存储。 

gdt表,后13位保存与gdt对应的下标,后3位包括程序是否在内存中以及cpu中程序的运行级别,gdt指向的表是一个以64位为单位的表。在此表中,代码段的信息和数据段的起始地址,相应的段限制和页交换,程序运行级别和内存粒度存储在该表中。

一旦对程序进行越界访问,CPU将生成相应的异构保护,并且将出现分段错误。 基本上,这是由于编程中不正确使用指针引起的。

本回答被网友采纳
第2个回答  推荐于2017-06-18
linux系统为一个进程的分配的堆栈空间只有8k左右,你定义了一个300万的整形数组,需要占用3000000*4=1200万k大小的堆栈空间,肯定会把堆栈撑爆的,故会出现核心已转储的错误提示。

为了提高程序的健壮性,防止堆栈越界的情况发生,一般局部变量分配的空间不要超过1024字节大小,就是一个255的整形数组。如果你想要用超过1024字节以上的空间,就调用malloc在堆中分配你想要的空间。本回答被网友采纳
第3个回答  2017-06-18
大概是堆栈溢出,3百万个指针的数组太大了,占地12M(32位机器),24M(64bit)。
想确认请在终端输入 ulimit -s,查看堆栈限制。
想无视堆栈限制,请尝试ulimit -s unlimited
第4个回答  2012-11-09
segmentation fault(core dump)
你写的代码有严重bug,导致程序崩溃
相似回答