第一种方法:指针数组
给出的代码写的是用动态内存先申请了三个整型指针,然后再在每一个指针之下申请了四个格子的整形变量,也就是一个3行4列的动态内存,但此时是一行一行的申请内存,所以每一行的头和上一行尾并不相等,而且需要注意的是:在释放第一种方法申请的动态内存时我们容易出现问题。到底是释放掉的是3*4*4个字节,还是3*4*4+3*4个字节。应该释放的3*4*4+3*4个字节
#include<stdio.h>
#include<malloc.h>
//1.指针数组
//每一行元素地址连续但是不能保证上一行的尾和下一行的头相等
int main()
{
int** p = (int**)malloc(3 * sizeof(int*)); //动态申请三个指针
for (int i = 0; i < 3; i++)
{
p[i]=(int *)malloc(4 * sizeof(int)); // 在申请的三个指针后在给每一行指针再申请四个格子的整型变量
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%p\n", &p[i][j]); //打印每一行指针的每一个整型位置的变量的地址
}
}
for(int i=0; i<3; i++) //此处是需要注意的 释放的时候容易出错,这里并不是单纯的释放掉p就可以我们可以算一下刚开始申请了三个整型指针变量,然后再给每一个整型指针又申请了四个整型变量所以总共申请的格子数应该是15个,而不是我们常识中12个
{
free(p[i]);
}
free(p);
return 0;
}
调试结果为:
第二种方法:数组指针,此时每个位置的地址是连着的
#include<stdio.h>
#include<malloc.h>
int main()
{
int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int)); //直接申请3行4列的二维数组指针
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%p\n", &p[i][j]); //打印每一个变量的地址
}
}
free(p); //用完之后,最后把p释放掉
return 0;
}
调试结果为:
第三种方法:用二维数组的思想去管理申请的一维数组,此时就是要明白二维数组的位置下标与一维数组位置下标的关系。(每个位置的地址也都是连着的)
#include<stdio.h>
int main()
{
int* p = (int*)malloc(3 * 4 * sizeof(int)); //直接申请12格子
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
p[i * 4 + j] = 1; //不能写成p[][]因为此处的p是指针 这种方法即可实现二维数组例如想找二维数组中第三行第二列的数那么它在一维数组中位置下标应该是2*4+1=9,刚好对上
printf("%p\n", &p[i * 4 + j]);
}
}
free(p); //释放掉占的空间
return 0;
}
调试结果为: