(1)已知第二维,
char (*a)[N];//指向数组的指针
a = (char (*)[N])malloc(sizeof(char *) * m);
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//N,一维数组
free(a);
(2)已知第一维,相当于是 M个一维数组的集合
char* a[M];//指针的数组 int i;
for(i=0; i<M; i++)
a[i] = (char *)malloc(sizeof(char) * n);
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
for(i=0; i<M; i++)
free(a[i]);
(3)已知第一维,一次分配内存(保证内存的连续性)
char* a[M];//指针的数组 int i;
a[0] = (char *)malloc(sizeof(char) * M * n);
for(i=1; i<M; i++)
a[i] = a[i-1] + n*sizeof(char);
printf("%d\n", sizeof(a));//4*M,指针数组
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
(4)两维都未知 ,相当于是 M个一维数组的集合
char **a;
int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
for(i=0; i<m; i++)
{
a[i] = (char *)malloc(sizeof(char) * n);//分配每个指针所指向的数组
}
printf("%d\n", sizeof(a));//4,指针 printf("%d\n", sizeof(a[0]));//4,指针 for(i=0; i<m; i++) { free(a[i]); } free(a);
(5)两维都未知,一次分配内存(保证内存的连续性)
char **a; int i;
a = (char **)malloc(sizeof(char *) * m);//分配指针数组
a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间
for(i=1; i<m; i++)
{
a[i] = a[i-1] + n*sizeof(char);
}
printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[0]));//4,指针
free(a[0]);
free(a);
http://wenku.baidu.com/view/d90e21c658f5f61fb73666e3.html
本文详细介绍了五种不同情况下二维数组的动态内存分配方法及其大小的打印结果,包括已知第二维、已知第一维、两维都未知等情况,并提供了具体的C语言代码实现。
2052

被折叠的 条评论
为什么被折叠?



