我正在尝试将一维数组转换为二维数组
如果要分配实际的 2D 数组,而不是指针数组,语法会变得有点棘手:
int X = 16, Y = 8;
char (*pt)[X][Y] = malloc(X*Y);
上面,pt
是一个指向X
的指针Y
由 char
s 数组组成。因为它是一个指针,所以访问其元素也需要星号和括号:
for (int i = 0 ; i != X ; i++) {
for (int j = 0 ; j != Y ; j++) {
(*pt)[i][j] = (char)(i*X+j);
}
}
当然,使用完数组后,您需要释放指针:
free(pt);
您需要单独分配矩阵的每一行:
unsigned char** index;
index = malloc(X * sizeof(unsigned char*)); // Allocate an array of pointers
for(int i = 0; i < X; i++)
index[i] = malloc(Y * sizeof(unsigned char)) // Allocate each row
另请参阅有关 malloc 指针转换的答案。
unsigned char **index;
index = (unsigned char**)malloc( X*Y );
是错误的。 index
是一个unsigned char**
.您需要malloc
两次才能获得 2D 数组。如果要分配X
行(每行都有 Y
列),请使用
unsigned char **index;
index = (unsigned char**)malloc( X * sizeof(unsigned char*) ); //Allocating number of rows
for(int i=0 ; i<X ; i++ )
{
index[i] = (unsigned char*)malloc( Y * sizeof(unsigned char)); // Allocate each column
}
您应该检查malloc
是否没有失败。您还应该在使用后free
所有内容,以避免内存泄漏。
编辑后,您似乎正在使用C++。
在C++中,您应该更喜欢动态 2D 数组std::vector< std::vector< unsigned char > >
。
std::vector< std::vector< unsigned char > > index(X, std::vector<unsigned char>(Y));
现在您可以将其用作index[i][j]
,它将自动清理,因此需要显式释放/删除。
现场演示在这里
仍然,如果要以常规方式分配符合 c 的数组,请使用
unsigned char** index;
try {
index = new int*[X];
for(int i = 0; i < X; ++i)
index[i] = new int[Y];
} catch(...) {...}
对于删除,您还需要单独删除每个元素。
旧答案
unsigned char **index;
index = malloc(X * sizeof *index);
if(!index) fail();
for(xi = 0; xi < X; ++xi) {
index[xi] = malloc(Y * sizeof **index);
if(!index[xi]) free_and_fail();
}
首先为 X 指针分配空间,然后在所有 X 指针中分配一个数组。
释放内存时,您需要单独释放每一行:
if(index) for(xi = Y-1; xi >= 0; --xi) { /* xi is signed */
free(index[xi];
}
free(index);
index = NULL;