1

如果我有一个像这样定义的动态定义的 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]);
   }
}

并继续像普通的二维数组一样使用它?或者这是不允许的?

编辑:这不是实现的代码,这只是出于好奇。所以从这个意义上说,它不是“真实”的代码。

4

2 回答 2

1

这:

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

是错的:

  1. calloc()在指针上使用没有意义。不能保证“所有位为零”对指针具有明确定义的含义。
  2. 尺寸不对;你是说你想要 100 个指针大小的项目,它应该是sizeof *tmparray
  3. 请记住,这sizeof不是函数,仅当参数是强制转换表达式(如sizeof (int))时才需要括号。
于 2012-11-13T14:53:03.750 回答
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)

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

于 2012-11-13T14:52:25.823 回答