program received signal SIGSEGV, Segmentation fault

最近再写人工智能决策树的时候,遇到了一个问题,即“program received signal SIGSEGV, Segmentation fault”,刚开始不知道该错误是什么意思,以为又是自己的代码写错了,毕竟程序崩掉是常有的事,所以在我改掉了所有的可能的错误之后,在运行一遍程序,发现依旧是这个错误,(运行小数据集的时候是没有出错的,但是运行大数据集时就会出现这个错误)内心感觉就像程序一样,整个崩掉。。。

上网搜索了一下,发现很多人都曾经遇到过这个问题,这就是”段错误“,关于段错误,最官方的解释是:

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

  看了上面的解释,我是似懂非懂,所以当务之急就是找到造成错误的具体原因。

  段错误产生的主要原因有四个:

  1、访问不存在的内存地址

  2、访问系统保护的内存地址

  3、访问只读的内存地址

  4、栈溢出

  两个关键点:

  1、声明指针没有创建用于存储的内存空间。

  2、指针声明时,指向的位置不确定,程序运行时,如果你运气好可能不出错,但是下次动态分配内存的时候你可能就没这么幸运了。(这就是我有时候可以运行成功,有时候不可以的原因)

  当程序里执行了无效的内存引用,计算机程序就可能抛出SIGSEGV,一个程序接收到SIGSEGV时的默认动作是异常终止。这个动作也许会结束进程,但是可能生成一个核心文件以帮助调试,或者执行一些其他特定于某些平台的动作。

你可能感兴趣的:(program received signal SIGSEGV, Segmentation fault)