如何使用malloc从一维数组转换为二维数组



我正在尝试将一维数组转换为二维数组

如果要分配实际的 2D 数组,而不是指针数组,语法会变得有点棘手:

int X = 16, Y = 8;
char (*pt)[X][Y] = malloc(X*Y);

上面,pt 是一个指向X的指针Ychar 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;

相关内容

  • 没有找到相关文章

最新更新