假设我从某个地方获取输入并将其存储在变量中。假设变量是 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
分配了空间,但由于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
。
int (*p)[Cols] = malloc( sizeof *p * Rows );
为Rows
xCols
int
数组分配足够的空间,并将该数组的地址分配给p
。 然后,您可以p[i][j]
访问每个元素。
要解除分配,您所需要的只是
free( p );