iMatlab

爱学习,爱Matlab

linux g++“段错误 (核心已转储) ”一种可能原因及其解决方法


我在编写程序c++程序时定义几个很大的数组,都是约为1000*1000维,之所以定义的这么大是因为我想编写的程序要将一块空间划分为很细小的网格,我用这些大数组存储这些网格图心的坐标及该图心点的权值。比如:

  1. int row_n=(int)ceil(allnodes.squareL/gridlength);       

  2. int col_n=row_n;    

  3.   

  4. float centroid_x[row_n][col_n];   

  5. float centroid_y[row_n][col_n];  

   row_n值为1000;


   终端在运行的时候总是出现

“段错误 (核心已转储) ”

   

    在Eclipse中出现如下错误

Thread [1] 6201 [core: 1] (Suspended : Signal : SIGSEGV:Segmentation fault)  main() at 1028.cc:131 0x8049483

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂   


      我的代码都是很简单的代码,也没用到指针什么的复杂的东西,怎么会出现这种问题呢?

   我们可以参看些关于段错误的知识:

   段错误主要原因是:

   1)访问系统数据区,尤其是往系统保护的内存地址写数据 ,最常见就是给一个指针以0地址 

   2)内存越界(数组越界,变量类型不一致等)

   3) 访问到不属于你的内存区域  

   那么看来我可能会出现数组越界的问题了!!

       那么在看些关于数组越界的背景吧(抱歉,小猴啥也不懂,找问题就得一点点点看,这里贴出自己是怎么找到问题所在的)

     http://blog.csdn.net/wind19/article/details/5964137

    看了帖子,对堆栈的概念加深了些了解,也有些启示,个人觉得我错误原因是这样的:

      栈空间用来存储数组等数据,那么段错误就应该是我存储的数组超过了它所在段的大小,于是在的程序执行的过程中一到跟大数组相关的步骤就会出现段错误的提示(SIGSEGV: Segmentation fault)。

     linux下应用  ulimit -a 命令查看当前栈空间大小,得到:

     8012   

     即我的系统下栈空间应该为8M,而可以自己算下自己定义的数组大小,发现我的数组每个大概3M多,而我的数组个数也大于3个,我的gdb中调试的过程中也恰巧是在第三个大维数数组那出现的问题,我的数组的确越过了stack段的边界,出现了错误。

▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂


     如何解决这个问题呢?

     我用

ulimit -s  102400

     将栈的大小改为100M(这回可够用了),然后运行程序或者debug,程序就能正确运行了。

    我在其他人的帖子里看见一些人说用vector容器可能会更好,自己还没有去深入学习,这是我下一步个工作吧,今天先把怎么解决这个问题的过程帖子这里。希望可以和大家交流下关于段错误的问题。

   解决问题中看到的一些觉得还不错的帖子:

   http://www.cs.ucsb.edu/~pconrad/cs16/10W/extraLabs/el01/  

   http://stackoverflow.com/questions/2346806/what-is-segmentation-fault

    http://www.linuxidc.com/Linux/2011-03/32874.htm

   

    

  

   

     



评论

热度(4)