用malloc动态申请一个二维数组的三种方法

原文链接:https://blog.csdn.net/fengxinlinux/article/details/51541003

方法一:利用二级指针申请一个二维数组。

#include<stdio.h>    
#include<stdlib.h>    

int main()
{
	int **a;  //用二级指针动态申请二维数组    
	int i, j;
	int m, n;
	printf("请输入行数\n");
	scanf("%d", &m);
	printf("请输入列数\n");
	scanf("%d", &n);
	a = (int**)malloc(sizeof(int*)*m);
	for (i = 0; i<m; i++)
		a[i] = (int*)malloc(sizeof(int)*n);
	for (i = 0; i<m; i++)
	{
		for (j = 0; j<n; j++)
		{
			printf("%p  ", &a[i][j]);     //输出每个元素地址,每行的列与列之间的地址时连续的,行与行之间的地址不连续  
		}
		printf("\n");
	}
	for (i = 0; i<m; i++)    //先释放内部的一维数组
		free(a[i]);

        free(a);        //最后释放外层的二维指针,释放完成可以将指针指向NULL,即 a = NULL;
        return 0;
}

3行4列的输出结果:可以看出每一行之间的元素的地址是连续的,行与行之间不连续。

方法二:用数组指针形式申请一个二维数组。

#include<stdio.h>    
#include<stdlib.h>    

int main()
{
	int i, j;	    
	int(*a)[2] = (int(*)[2])malloc(sizeof(int)* 3 * 2);    //申请一个3行2列的整型数组
	for (i = 0; i<3; i++)
	{
		for (j = 0; j<2; j++)
		{
			printf("%p  ", &a[i][j]);  //输出数组每个元素地址,每个元素的地址是连续的  
		}
		printf("\n");
	}
	
	free(a);
	return 0;
}

3行2列的输出结果:可以看出每一行之间的元素的地址是连续的,行与行之间连续。

方法三:用一个单独的一维数组来模拟二维数组。

#include <stdio.h>  
#include <stdlib.h>  

int main()
{
	int nrows, ncolumns;
	int *Array;
	int i, j;
	printf("please input nrows&ncolumns:\n");
	scanf("%d%d", &nrows, &ncolumns);
	Array = (int *)malloc(nrows*ncolumns*sizeof(int));   //申请内存空间  
	for (i = 0; i<nrows; i++)
	{
		for (j = 0; j<ncolumns; j++)
		{
			Array[i*ncolumns + j] = 1;
			printf("%d ", Array[i*ncolumns + j]);   //用Array[i*ncolumns+j] 访问第i,j个成员  
		}
		printf("\n");
	}
	free(Array);
	return 0;
}

原文链接:https://blog.csdn.net/fengxinlinux/article/details/51541003

猜你喜欢

转载自blog.csdn.net/hola_ya/article/details/80627178