[問題] calloc配置大小問題?

看板C_and_CPP (C/C++)作者 (K.L)時間14年前 (2011/11/29 15:49), 編輯推噓1(1015)
留言16則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VS 2008 問題(Question): 當size太大的時候,下列程式碼初始化時會發生錯誤 餵入的資料(Input): long int size = 100000*203+2 會掛 size = 10000*203+2 可以順利執行 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 1. CX0030 無法評估的運算式 2. 寫入-1時會錯誤 程式碼(Code):(請善用置底文網頁, 記得排版) R_1=(float *)calloc(size+1,sizeof(float)); R_2=(float *)calloc(size+1,sizeof(float)); R_3=(float *)calloc(size+1,sizeof(float)); R_4=(float *)calloc(size+1,sizeof(float)); R_5=(float *)calloc(size+1,sizeof(float)); R_6=(float *)calloc(size+1,sizeof(float)); R_layer_1_1 = (float *)calloc(size+1,sizeof(float)); R_layer_1_2 = (float *)calloc(size+1,sizeof(float)); R_layer_2_1 = (float *)calloc(size+1,sizeof(float)); R_layer_2_2 = (float *)calloc(size+1,sizeof(float)); temp_1 = (float *)calloc(size+1,sizeof(float)); temp_2 = (float *)calloc(size+1,sizeof(float)); temp_3 = (float *)calloc(size+1,sizeof(float)); temp_4 = (float *)calloc(size+1,sizeof(float)); temp_5 = (float *)calloc(size+1,sizeof(float)); temp_6 = (float *)calloc(size+1,sizeof(float)); for (long int i = 1 ; i < size ; i++) { R_1[i]=-1; R_2[i]=-1; R_3[i]=-1; R_4[i]=-1; R_5[i]=-1; =====>錯誤 R_6[i]=-1; =====>錯誤 temp_1[i]=-1; temp_2[i]=-1; temp_3[i]=-1; temp_4[i]=-1; temp_5[i]=-1; temp_6[i]=-1; R_layer_1_1[i]=-1; R_layer_1_2[i]=-1; R_layer_2_1[i]=-1; R_layer_2_2[i]=-1; } 補充說明(Supplement): 想請教一下上述程式碼有什麼問題嘛? 想要跑大資料時都會出現錯誤,謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.1.134

11/29 15:55, , 1F
你要來了 16 個大小為 size 的 float 陣列
11/29 15:55, 1F

11/29 15:57, , 2F
若 size 估計成 20M 左右的話 你要來了 16x20Mx4 約 1.25G
11/29 15:57, 2F

11/29 15:58, , 3F
嗯嗯,然後呢@@?
11/29 15:58, 3F

11/29 16:07, , 4F
跟編譯器能配置的大小有關係嗎? 可以調整它大小的嗎?
11/29 16:07, 4F

11/29 16:14, , 5F
size_t size = 100000llu*203+2; 試試看?
11/29 16:14, 5F

11/29 16:16, , 6F
一樣耶@@ 0xC0000005: 寫入位置 0x00000004
11/29 16:16, 6F

11/29 16:16, , 7F
發生存取違規
11/29 16:16, 7F

11/29 16:20, , 8F
都是資料筆數大到一定情況就會當掉@@
11/29 16:20, 8F

11/29 18:06, , 9F
先檢查calloc的回傳值吧...皆不是NULL後面的程式碼才
11/29 18:06, 9F

11/29 18:06, , 10F
有執行的必要
11/29 18:06, 10F

11/29 18:12, , 11F
值很明顯跟你講這件事了, 參數有數字表示可能要用陣列
11/29 18:12, 11F

11/29 18:12, , 12F
^變
11/29 18:12, 12F

11/29 18:13, , 13F
改寫了, 不然你繼續寫下去程式碼會長到很難看
11/29 18:13, 13F

11/29 19:57, , 14F
calloc回來都不用檢查的嗎...
11/29 19:57, 14F

11/29 19:57, , 15F
如果需要用到上GB的記憶體,到64bit環境下吧
11/29 19:57, 15F

11/29 19:58, , 16F
32bit usermode也就只有2GB,很容易就滿了
11/29 19:58, 16F
文章代碼(AID): #1Er8wRL7 (C_and_CPP)
文章代碼(AID): #1Er8wRL7 (C_and_CPP)