C语言用动态内存申请二维数组

C语言用动态内存申请二维数组

第一种方法:指针数组

给出的代码写的是用动态内存先申请了三个整型指针,然后再在每一个指针之下申请了四个格子的整形变量,也就是一个3行4列的动态内存,但此时是一行一行的申请内存,所以每一行的头和上一行尾并不相等,而且需要注意的是:在释放第一种方法申请的动态内存时我们容易出现问题。到底是释放掉的是3*4*4个字节,还是3*4*4+3*4个字节。应该释放的3*4*4+3*4个字节

#include

#include

//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

#include

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

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;

}

调试结果为:

相关新闻

电脑没有一点声音是怎么回事。
365bet足球直播

电脑没有一点声音是怎么回事。

🕒 10-10 👽 686
只知其一不知其二,居然还有PD-L2
365体育官网登录

只知其一不知其二,居然还有PD-L2

🕒 07-19 👽 1798
曲面电视真的好吗?带你全面认识曲面电视
365体育官网登录

曲面电视真的好吗?带你全面认识曲面电视

🕒 08-05 👽 9395
怎么用PS做铅笔画?PS制作铅笔画教程
帕尼尼球星卡FIFA365

怎么用PS做铅笔画?PS制作铅笔画教程

🕒 07-02 👽 6711
人物生平
365体育官网登录

人物生平

🕒 09-24 👽 1305
爱剪辑手机版怎么添加片头 爱剪辑制作片头方法介绍
帕尼尼球星卡FIFA365

爱剪辑手机版怎么添加片头 爱剪辑制作片头方法介绍

🕒 08-21 👽 8309