[問題] 大容量陣列宣告定義問題

看板C_and_CPP作者 (バスケがしたいです)時間7年前 (2018/05/21 16:53), 編輯推噓6(6017)
留言23則, 6人參與, 7年前最新討論串1/1
大容量陣列宣告定義問題 開發環境: 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]; 宣告. 有什麼優缺點嗎? 謝謝大家解惑. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 42.73.151.64 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1526892817.A.EE7.html

05/21 17:00, 7年前 , 1F
>limit memoryuse unlimited
05/21 17:00, 1F

05/21 17:00, 7年前 , 2F
大型陣列建議還是放在 heap,stack太容易爆了
05/21 17:00, 2F

05/22 03:31, 7年前 , 3F
你確定這段會有segmentation fault?
05/22 03:31, 3F

05/22 04:44, 7年前 , 4F
你這個不叫二維陣列,陣列的定義是一塊連續的記憶體,你發
05/22 04:44, 4F

05/22 04:44, 7年前 , 5F
生segmentation fault是你列的這段code?
05/22 04:44, 5F

05/22 07:16, 7年前 , 6F
這個只是一小片段程式. 這個函式裡做了蠻多次動態記憶體
05/22 07:16, 6F

05/22 07:16, 7年前 , 7F
配置. 在我新加了幾個如文中的配置後. 就segmentation
05/22 07:16, 7F

05/22 07:16, 7年前 , 8F
fault (core dumped)
05/22 07:16, 8F

05/22 10:50, 7年前 , 9F
linux 的話,裝valgrind去看看是哪裡取用了不合法的memory
05/22 10:50, 9F

05/22 11:00, 7年前 , 10F
它有core dump的話可以debug一下,不過allocate失敗感覺不會
05/22 11:00, 10F

05/22 11:00, 7年前 , 11F
是這樣的訊息…
05/22 11:00, 11F

05/22 11:07, 7年前 , 12F
話說你那個f==0,0和null是不一樣的喔
05/22 11:07, 12F

05/22 11:44, 7年前 , 13F
@hakman 好的考慮試用valgrid. 第一次聽到這個東西.
05/22 11:44, 13F

05/22 11:45, 7年前 , 14F
@cphe 可以從core dump猜測可能犯錯的地方嗎?
05/22 11:45, 14F

05/22 11:46, 7年前 , 15F
core dump 跟 segmentation fault 對我來說訊息太少
05/22 11:46, 15F

05/22 11:47, 7年前 , 16F
不會判讀.
05/22 11:47, 16F

05/22 11:47, 7年前 , 17F
可以吧 你google一下就可以找到debug方式
05/22 11:47, 17F

05/22 11:48, 7年前 , 18F
我不知道 f==NULL 跟 f==0 不一樣
05/22 11:48, 18F

05/22 11:49, 7年前 , 19F
目前正在把這個function配置記憶體的程式碼看一下
05/22 11:49, 19F

05/22 11:49, 7年前 , 20F
希望趕快找到bug.
05/22 11:49, 20F

05/22 11:50, 7年前 , 21F
程式只是我的工具. 大概是一些計算機的觀念不好犯錯了.
05/22 11:50, 21F

05/22 13:57, 7年前 , 22F
謝謝大家的回覆. 稍晚再做個總結.
05/22 13:57, 22F

05/23 09:06, 7年前 , 23F
win32測過表示沒毛病
05/23 09:06, 23F
文章代碼(AID): #1R0eaHxd (C_and_CPP)