动态地从3D阵列转换为C中的2D阵列

时间:2012-11-13 14:31:19

标签: c arrays multidimensional-array malloc

如果我有一个如此定义的动态定义的3D数组:

float   ***tmparray;
int     ii, jj;

tmparray = calloc(100, sizeof(tmparray));

for(ii = 0; ii < 100; ii++)
   tmparray[ii] = calloc(100, sizeof(tmparray[ii]));

for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      tmparray[ii][jj] = calloc(2, sizeof(tmparray[ii][jj]));
   }
}

我可以做一些像

这样的事情
for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      free(tmparray[ii][jj]);
   }
}

并继续像常规2D阵列一样使用它?或者这是不允许的?

编辑:这是未实现的代码,这只是出于好奇。因此,在这个意义上它不是“真正的”代码。

2 个答案:

答案 0 :(得分:1)

此:

tmparray = calloc(100, sizeof(tmparray));

错了:

  1. 在指针上使用calloc()是没有意义的。 “所有位为零”并不能保证指针具有明确的含义。
  2. 大小错误;你说你想要100个与指针一样大小的项目,它应该是sizeof *tmparray
  3. 请记住,sizeof不是函数,仅当参数是强制转换表达式(如sizeof (int))时才需要括号。

答案 1 :(得分:0)

calloc时出现了错误。

tmparray = calloc(100, sizeof(*tmparray));

for(ii = 0; ii < 100; ii++)
   tmparray[ii] = calloc(100, sizeof(*tmparray[ii]));

for(ii = 0; ii < 100; ii++){
   for(jj = 0; jj < 100; jj++){
      tmparray[ii][jj] = calloc(2, sizeof(*tmparray[ii][jj]));
   }
}

回过头来回答问题,你不能,因为

sizeof(*tmparray[ii]) == sizeof(float*) 

sizeof(*tmparray[ii][jj]) == sizeof(float)

P.S。在32位机器上它应该工作,但不是一种可移植的方式。