[问题] 大容量阵列宣告定义问题

楼主: eagle32 (バスケがしたいです)   2018-05-21 16:53:35
大容量阵列宣告定义问题
开发环境: linux
我在一个函式内使用动态内存配置定义一个
2维double阵列.其容量大小为
size_xyz*19=7296,000
执行时程式会报 'segmentation fault' 讯息.
发现执行到如下所示的for loop 程式就挂了.
double **f;
f= (double **) calloc(size_xyz, sizeof(double *));
if (f== 0) fatal_err("cannot allocate f", -1);
for(int pos=0; pos < size_xyz; pos++)
{
f[pos] = (double *) calloc(19, sizeof(double));
if(f[pos] == 0) fatal_err("cannot allocate f[]", -1);
}
稍微google一下发现也许透过bash档的设定
解除可使用内存容量的限制, 或者,更改编译器
的参数设定加大stack size 问题也许可以解决.
bash 档我已经改了. 但是没有功效.
目前使用 Intel compiler 不知道编译器参数
如何设定.
还是说像这种大型阵列最好用多个维度打散定义?
譬如将目前的2维阵列变3维.
再问, 像这种已知大小的阵列其实也没必要用
动态内存配置. 简单的使用
double f[size_xyz][19]; 宣告.
有什么优缺点吗?
谢谢大家解惑.
作者: bluesoul (忙死你老爸)   2018-05-21 17:00:00
>limit memoryuse unlimited大型阵列建议还是放在 heap,stack太容易爆了
作者: Lipraxde (Lipraxde)   2018-05-22 03:31:00
你确定这段会有segmentation fault?
作者: cphe (魔鬼藏在垃圾筒里)   2018-05-22 04:44:00
你这个不叫二维阵列,阵列的定义是一块连续的内存,你发生segmentation fault是你列的这段code?
楼主: eagle32 (バスケがしたいです)   2018-05-22 07:16:00
这个只是一小片段程式. 这个函式里做了蛮多次动态内存配置. 在我新加了几个如文中的配置后. 就segmentationfault (core dumped)
作者: hakman (^____^)   2018-05-22 10:50:00
linux 的话,装valgrind去看看是哪里取用了不合法的memory
作者: cphe (魔鬼藏在垃圾筒里)   2018-05-22 11:00:00
它有core dump的话可以debug一下,不过allocate失败感觉不会是这样的讯息…话说你那个f==0,0和null是不一样的喔
楼主: eagle32 (バスケがしたいです)   2018-05-22 11:44:00
@hakman 好的考虑试用valgrid. 第一次听到这个东西.@cphe 可以从core dump猜测可能犯错的地方吗?core dump 跟 segmentation fault 对我来说讯息太少不会判读.
作者: cphe (魔鬼藏在垃圾筒里)   2018-05-22 11:47:00
可以吧 你google一下就可以找到debug方式
楼主: eagle32 (バスケがしたいです)   2018-05-22 11:48:00
我不知道 f==NULL 跟 f==0 不一样目前正在把这个function配置内存的程式码看一下希望赶快找到bug.程式只是我的工具. 大概是一些计算机的观念不好犯错了.
作者: lightyen (lightyen)   2018-05-23 09:06:00
win32测过表示没毛病

Links booklink

Contact Us: admin [ a t ] ucptt.com