我建议使用以下方式分配数组,以使所有元素在内存中连续:
int n;
char** array2d=malloc(n*sizeof(char*));
if(array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
array2d[0]=malloc(n*n*sizeof(char));
if(array2d[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
int i;
for (i = 1 ; i < n ; i++)
{
array2d[i] =& array2d[0][i*n];
}
元素可以通过array2d[i][j] 加入。
二维数组是一个指向行首的指针数组,所有项目都通过对malloc()的一次调用来分配。
如果数据由 fftw 或 lapack 等库处理,这种分配内存的方式很有用。指向数据的指针是array[0]。
确实,写array2d[0][n]=42 或array2d[1][0]=42 执行相同的操作!
见:
在函数中:
int alloc2d(int n,char ***array2d){
*array2d=malloc(n*sizeof(char*));
if(*array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
(*array2d)[0]=malloc(n*n*sizeof(char));
if((*array2d)[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
int i;
for (i = 1 ; i < n ; i++)
{
(*array2d)[i] =& (*array2d)[0][i*n];
}
return 0;
}
由char** array2d;alloc2d(42,&array2d);从main调用
测试代码:
#include <stdio.h>
#include <stdlib.h>
int alloc2d(int n,char ***array2d){
*array2d=malloc(n*sizeof(char*));
if(*array2d==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
(*array2d)[0]=malloc(n*n*sizeof(char));
if((*array2d)[0]==NULL){fprintf(stderr,"malloc failed\n");exit(1);}
int i;
for (i = 1 ; i < n ; i++)
{
(*array2d)[i] =& (*array2d)[0][i*n];
}
}
int free2d(char **array2d){
free(array2d[0]);
free(array2d);
return 0;
}
int main()
{
int n=42;
char** array2d;
alloc2d(n,&array2d);
array2d[0][n]=13;
printf("%d\n",array2d[1][0]);
free2d(array2d);
return 0;
}
由gcc main.c -o main 编译。正如预期的那样,输出为 13。添加了释放内存的函数。