如何在 C 中以 int (*p)[n] 形式动态分配指针?

问题描述

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

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

int (*p)[Cols]

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

教我怎么做真的很感激!

解决方法

你绝对可以使用 int (*p)[Cols],它是一个指向大小为 Cols 的数组的指针(Cols 乘以 int 的大小,以字节为单位),你只需要分配内存对于它,在您这样做之前,它不会指向有效的内存位置。限制是分配的内存需要在 Cols 的倍数块中:

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

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

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

用法:

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

上述表达式只为一行 int 分配了空间,但由于 p 是一个指向数组的指针,因此您可以为它们中的尽可能多的分配空间你想要(考虑到内存限制)。

假设您想要一个包含 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(p);

而像指针数组或指向指针的指针这样的结构会强制您有多个 free

,
{NewClass(1,2),NewClass(3,4)}

int (*p)[Cols] = malloc( sizeof *p * Rows ); x Rows 数组分配足够的空间,并将该数组的地址分配给 Cols。然后您可以使用 int 访问每个元素。

释放所有你需要的是

p