假设我从某个地方获得输入并将其存储在一个变量中。假设变量是 Cols。
我想在表单中创建一个数组
int (*p)[Cols]
现在,我知道你不能这样做。那么我将如何动态分配它来做到这一点?
教我如何做到这一点将不胜感激!
假设我从某个地方获得输入并将其存储在一个变量中。假设变量是 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
将指向一个可能占用 10int
秒的内存块。
用法:
for (int i = 0; i < Cols; i++)
{
p[0][i] = i;
}
上述表达式只为一行int
s 分配空间,但由于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);
而像指针数组或指向指针的指针这样的结构会强制你有多个free
s。
int (*p)[Cols] = malloc( sizeof *p * Rows );
为Rows
xCols
数组分配足够的空间int
并将该数组的地址分配给p
. 然后,您可以将每个元素作为p[i][j]
.
解除分配所有你需要的是
free( p );