我不是在讨论固定大小的指针问题,也不涉及指针存储方式,请注意这与this和this不同。我的问题是编译器是否能够自动化手动函数。
根据此Stack Overflow问题,多维数组是按顺序存储的。
// These arrays are the same
int array1[3][2] = {{0, 1}, {2, 3}, {4, 5}};
int array2[6] = { 0, 1, 2, 3, 4, 5 };
然而,我正在尝试在预分配的内存中创建一个包含浮点数的二维数组:
float a[5][10]
float b[50]; // should be same memory
然后我尝试:
vector<char> x(1000);
float** a = (float**)x.data();
a[0][1] = 5;
显然,上述代码崩溃了,因为编译器不知道要分配多大的数组内存,就像第一个示例中编译器已知的数组一样。
有没有一种方法告诉编译器在连续的内存中分配多维数组,而不需要手动计算指针(例如,通过手动移动索引并调用放置新元素来实现)?
目前,我正在手动完成这项工作,例如:
template <typename T> size_t CreateBuffersInMemory(char* p,int n,int BufferSize)
{
// ib = T** to store the data
int ty = sizeof(T);
int ReqArraysBytes = n * sizeof(void*);
int ReqT = ReqArraysBytes * (ty*BufferSize);
if (!p)
return ReqT;
memset(p, 0, ReqT);
ib = (T**)p;
p += n * sizeof(void*);
for (int i = 0; i < n; i++)
{
ib[i] = (T*)p;
p += ty*BufferSize;
}
return ReqT;
}
非常感谢。
float**
的语法是相同的:a[i][j]
,但访问真正的多维数组的语义完全不同。float**
是指向指针的指针。因此,第一维应该包含指向行的指针。 - rustyxfloat **
和float [][]
的工作原理可能有助于回答这个问题。也许你可以简单地参考一下那篇帖子? - andreee