2014-12-08 79 views
0

我試圖爲[10] [10] [2]的三維字符數組分配內存。將所有值設置爲空格時,會出現分段錯誤:[11]位於[0] [2] [1]。 下面是代碼:使用c中的calloc分配3維數組的內存

aiBoard =(char ***) calloc(SIZE,sizeof(char **)); 

for(i = 0; i < SIZE;i++) 
{ 
    aiBoard[i] = (char **)calloc(SIZE, sizeof(char*)); 
} 
for(i = 0;i < SIZE;i++) 
{ 
    for(j = 0; j < 2; j++) 
    { 
     aiBoard[i][j] = (char*)calloc(2,sizeof(char)); 
    } 

} 

for(i = 0; i < SIZE; i++) 
{ 
    for(j = 0; j < SIZE; j++) 
    { 
     for(k = 0; k < 2; k++) 
     { 
      aiBoard[i][j][k] = ' '; 
     } 
    } 
} 
+2

你混'SIZE'和'2'的第二級。 ('j') – user13500 2014-12-08 02:33:52

+0

你實際上分配了維數'[10] [2] [2]' - 把第一個'j <2'改成'j <10'。擁有一組嵌套循環而不是其中三組會更清楚。 – 2014-12-08 02:39:44

+0

我明白你的意思,但它分配給很多內存。 – 2014-12-08 02:40:10

回答

0

你用什麼價值SIZE? 0或1會導致崩潰,超過2會導致崩潰。你真的在哪裏使用SIZE?否則,你只是calloc - 荷蘭國際集團2和硬編碼「2」 ......應改爲SIZE

這樣的其他用途:

for(i = 0;i < SIZE;i++) 
{ 
    for(j = 0; j < SIZE; j++) 
    { 
     aiBoard[i][j] = (char*)calloc(SIZE,sizeof(char)); 
    } 

} 

for(i = 0; i < SIZE; i++) 
{ 
    for(j = 0; j < SIZE; j++) 
    { 
     for(k = 0; k < SIZE; k++) 
     { 
      aiBoard[i][j][k] = ' '; 
     } 
    } 
} 

真的,你應該有三個尺寸

#define iSIZE (10) 
#define jSIZE (10) 
#define kSIZE (2) 

for(i = 0;i < iSIZE;i++) 
    { 
     for(j = 0; j < jSIZE; j++) 
     { 
      aiBoard[i][j] = (char*)calloc(jSIZE,sizeof(char)); 
     } 

    } 

for(i = 0; i < iSIZE; i++) 
{ 
    for(j = 0; j < jSIZE; j++) 
    { 
     for(k = 0; k < kSIZE; k++) 
     { 
      aiBoard[i][j][k] = ' '; 
     } 
    } 
} 
+0

SIZE定義爲10 – 2014-12-08 02:43:30

+0

請顯示您的定義爲aiBoard ....它不能是char aiBoard [10] [10] [2];因爲該聲明不能被calloc-ed或malloc-ed ...定義爲char *** aiBoard。 – Grantly 2014-12-08 02:50:59

+0

定義是char *** aiBoard。 – 2014-12-08 03:12:55