如果我有一个如此定义的动态定义的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阵列一样使用它?或者这是不允许的?
编辑:这是未实现的代码,这只是出于好奇。因此,在这个意义上它不是“真正的”代码。
答案 0 :(得分:1)
此:
tmparray = calloc(100, sizeof(tmparray));
错了:
calloc()
是没有意义的。 “所有位为零”并不能保证指针具有明确的含义。sizeof *tmparray
。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位机器上它应该工作,但不是一种可移植的方式。