0

假设我从某个地方获得输入并将其存储在一个变量中。假设变量是 Cols。

我想在表单中创建一个数组

int (*p)[Cols]

现在,我知道你不能这样做。那么我将如何动态分配它来做到这一点?

教我如何做到这一点将不胜感激!

4

2 回答 2

4

您绝对可以使用int (*p)[Cols],它是一个指向大小数组的指针ColsCols乘以int,以字节为单位),您只需为其分配内存,直到您这样做,它不会指向有效的内存位置。约束是分配的内存需要位于以下倍数的块中Cols

int (*p)[Cols] = malloc(sizeof *p); //prefered

或者

int (*p)[Cols] = malloc(sizeof(int) * Cols); //alternative

在上述两个表达式中,假设Cols的值为 10,p将指向一个可能占用 10int秒的内存块。

用法:

for (int i = 0; i < Cols; i++)
{
    p[0][i] = i;
}

上述表达式只为一行ints 分配空间,但由于p是指向数组的指针,因此您可以为任意数量的 s 分配空间(考虑到内存限制)。

假设您想要一个包含 5 行和Cols列的数组:

int (*p)[Cols] = malloc(sizeof *p * 5);

用法:

for (int i = 0; i < 5; i++)
{
    for (int j = 0; j < Cols; j++)
    {
        p[i][j] = i * j;
    }
}

正如您(可能)知道的那样,这种构造主要用于模拟 2D 数组,其中一个优点是您可以使用一个 free 来释放所有内存:

free(p);

而像指针数组或指向指针的指针这样的结构会强制你有多个frees。

于 2021-05-01T18:11:05.930 回答
0
int (*p)[Cols] = malloc( sizeof *p * Rows );

RowsxCols数组分配足够的空间int并将该数组的地址分配给p. 然后,您可以将每个元素作为p[i][j].

解除分配所有你需要的是

free( p );
于 2021-05-01T21:38:45.550 回答