我很抱歉问了一个基本问题,但我真的找不到合适的答案。我继承了一个C++代码,其中的一部分具有以下形式的2D分配函数Allocate2D
:
float** Allocate2D(long long sizeX, long long sizeY)
{
float** p = new float*[sizeY];
p[0] = new float[sizeX*sizeY];
for (long long z = 0; z < sizeY; z++) {
p[z] = p[0] + z * sizeX;
}
return ptr;
}
int main(){
long long nX = ... ;
long long nY = ... ;
short** A = (short **)Allocate2D(nX, nY);
// do stuff with A ...
}
我有两个问题:
1-Allocate2D
是否正在创建大小为sizeX
xsizeY
的2D阵列?
2-当为float**
定义Allocate2d
时,分配2Dshort
阵列(如A
(是否为常见/合法/良好做法?
-
是。这确实取决于你所说的";2D阵列";。创建用于存储按二维索引的数据的数据结构的方法不止一种。可以像在
A[y][x]
中那样,用二维解引用A
,它将按预期工作。此外,A[0]
中将有一个指针指向sizeX x sizeY浮点的连续数组,其中x维度变化最快。这是使用float B[sizeY][sizeX]
也会得到的内存布局。然而,A
和B
的类型(忽略float和short(并不相同。A
是指向指针数组的指针,而B
衰减为指向浮点的指针。 -
没有。将指针强制转换为指向其他类型是不合法的。它打破了指针别名规则。此外,由于
sizeof(float)
几乎肯定不等于sizeof(short)
,所以阵列的大小将是错误的,即它将是nX*2 × nY
。然而,由于float*
从未被解引用为float
,我们可以清楚地看到,浮点指针的寿命非常有限,因此实际上不会有问题。
所以这是可行的,除了数组是它应该的两倍大。但是将浮点指针变成短指针并不是严格合法的,而且很难看。编写一个正确类型的函数模板会更好,也更容易。