2D阵列总是需要分配循环吗?

时间:2016-06-08 19:49:21

标签: c arrays malloc allocation

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

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

}

3 个答案:

答案 0 :(得分:5)

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

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

上面的代码将array声明为指向M - int元素数组的指针,然后为该数组类型的N个实例分配足够的空间,给我们存储N M int数组M

如果在编译时未知array的大小,则SELECT * FROM ( SELECT * FROM table1 WHERE ExampleCode1 BETWEEEN 1 AND 10 AND ExampleNo IN (1, 2, 3, 4) AND ExampleQuantity =! 0 ) tab_tmp WHERE AND ExamplePrice/ExampleQuantity = ExampleAmount; 可变长度数组,在C89或更早版本中不受支持。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

例如参见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()的多次调用,那么这是分配2D数组的另一种方法:

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;

设置值

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

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

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