2014-12-08 81 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