Bootstrap

【C语言】动态分配一个二维数组+图解

相信有朋友在刷题或者某一些场合上要使用一个动态二维数组,C语言实现一个动态二维数组要自己分配内存。那如何操作呢?

首先我们申请一个动态的二级指针,让该二维数组在申请int*类型数组的内存空间 赋值给int**二级指针类型,在分别给int*类型的数组申请空间.指向int类型存放值.

 需要注意:

  1.  在同一行中的元素地址是连续的,而不同行中元素地址是不连续的。因为在malloc(int*)的时候他是在堆上随机分配的内存.
  2.  释放内存不能直接释放arr,这样会导致内存泄漏,因为二级指针arr里面存放的一级指针int* 也是malloc动态分配出来的,要记得先回收,最后在释放二级指针int**。
  3.  空间不能申请太大,堆上的内存是有限的。
int main()
{
	//申请几行几列
	int row = 0 ; //行
	int col = 0; //列
	scanf("%d %d", &row, &col);
	int** arr = (int**)malloc(sizeof(int*) * row); //申请一个动态二级指针
	int i = 0;
	for (i = 0; i < row; i++)
	{
		arr[i] = (int*)malloc(sizeof(int) * col); //申请一行有几个元素
	}
	
	//输入二维数组的值
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}
	
	//打印二维数组
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	
	//同一行中元素地址是连续的,不同行中元素地址不一定是连续的。
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			printf("%p ", &arr[i][j]);
		}
		printf("\n");
	}
	
	//释放动态内存分配的二维数组
	for (i = 0; i < row; i++)
	{
		free(arr[i]);
	}
	free(arr);
	system("pause");
}

 

 

;