相信有朋友在刷题或者某一些场合上要使用一个动态二维数组,C语言实现一个动态二维数组要自己分配内存。那如何操作呢?
首先我们申请一个动态的二级指针,让该二维数组在申请int*类型数组的内存空间 赋值给int**二级指针类型,在分别给int*类型的数组申请空间.指向int类型存放值.
需要注意:
- 在同一行中的元素地址是连续的,而不同行中元素地址是不连续的。因为在malloc(int*)的时候他是在堆上随机分配的内存.
- 释放内存不能直接释放arr,这样会导致内存泄漏,因为二级指针arr里面存放的一级指针int* 也是malloc动态分配出来的,要记得先回收,最后在释放二级指针int**。
- 空间不能申请太大,堆上的内存是有限的。
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");
}