【问题标题】:Do 2D Arrays Always Need a Loop for Allocation?二维数组是否总是需要循环进行分配?
【发布时间】:2016-10-09 06:16:48
【问题描述】:

我正在尝试分配一个二维数组。我看到很多人在分配时使用循环(Dynamically allocated 2d array),但我仍然不确定一个人是否总是需要使用循环来分配 C 中的二维数组。我是否需要循环,因为我的代码只分配一列?

int ** allocate(int width, int height){
    int **array = malloc(sizeof(int *) * width);
    array[i] = malloc(sizeof(int) * height);
    return array;

}

【问题讨论】:

  • 嗯,首先你需要在某处声明一个i
  • @KerrekSB 有趣的是,我想说他没有二维数组(数组数组),而是指针数组。土豆土豆。
  • 更像是一棵树
  • @WhozCraig:是的,甚至更好。正在删除。
  • 好的,所以我了解到数组数组不等同于二维数组。所以如果我要分配指针样式的指针,我总是需要一个循环。感谢您的提示。

标签: c arrays malloc allocation


【解决方案1】:

例如见How do I allocate a 2 D array with contigious memory ? How Do I use it to access rows and columns? Give me an example

如果要避免的是多次调用malloc(),那么这里有另一种分配二维数组的方法:

int row=42;
int col=35;
int** array=malloc(row*sizeof(int*));
if(array==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
array[0]=malloc(row*col*sizeof(int));
if(array[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
int i;
for(i=1;i<row;i++){
    array[i]=&array[0][i*col];
}
...
free(array[0]);
free(array);

值仍然可以由int val=array[i][j] 检索并由array[i][j]=42; 设置

与您的问题中介绍的方法相比,本方法可确保行在内存中是连续的。因此,这种floatdouble 的数组可以很容易地被 LAPACK 库用作矩阵,或者被 FFTW 库用来计算图像的 2D 快速傅里叶变换(卷积......)。但是动态增加数组的大小要困难得多。

请注意,数组的大小可以在程序编译后的几天内由程序在执行时计算。

这个技巧可以扩展到更高的维度(3D,4D,...),但它不会变得更漂亮!

【讨论】:

    【解决方案2】:

    不,您并不总是需要循环。

    int (*array)[M] = malloc( sizeof *array * N ); 
    

    上面的代码将array声明为指向intM元素数组的指针,然后为该数组类型的N实例分配足够的空间,为我们提供N的存储空间。 987654327@int 的数组。

    如果M 的大小在编译时未知,则array 是一个可变长度数组,C89 或更早版本不支持该数组。

    【讨论】:

    • 值得注意的是,这样的二维数组是要放置在连续的内存位置中,而不是“堆碎片”方法。
    • 旁注:这将始终生成方形数组。如果您想要“锯齿状”数组(例如,第一行是 5 个列,第二行是 3 个列等),您可以在每行上使用显式 malloc 来做到这一点
    【解决方案3】:

    在 C 中创建二维数组有两种不同的常用方法。如果内部维度是固定的(即在编译时已知),则可以将其声明为这些固定大小数组的数组,然后分配一大块内存。如果你不这样做,那么你必须分配一个指向行的指针数组,然后执行一个循环分配每一行。

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      • 1970-01-01
      相关资源
      最近更新 更多