C语言动态分配二维数组内存

C语言动态分配二维数组内存

C语言内存管理主要包括malloc()、remalloc()、free()三个函数。

malloc原型 extern void *malloc(unsigned int num_bytes);

m行n列的 二维数组的分配,主要有三种方法:

一、分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组

#include

#include

#include

#include

//二维数组内存分配

int main()

{

int i,j,c=0;

int m,n;

int **p;

int *head;

scanf("%d %d",&m,&n);

p=(int **)malloc(sizeof(int *)*m);

if (p==NULL)

{

puts("memory allocation error!");

return;

}

//head=(int *)p+m; //指向数据内容起始的首地址

//memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零

for (i=0;i

{

//p[i]=head+(i*n); //both is ok

*(p+i)=(int *)malloc(sizeof(int)*n);

}

for(i=0;i

{

for (j=0;j

{

*(*(p+i)+j)=c++;

}

}

for(i=0;i

{

for (j=0;j

{

printf("%x: %4d\t",&p[i][j],p[i][j]);

}

printf("\n");

}

for (i=0;i

{

free(p[i]);

}

free(p);

system("pause");

return 0;

}

View Code

二、分配一个长度为m*n的一级指针(即一维数组),通过地址转换 来模拟二维数组的行为

代码较简单,略去

三、分配一个长度为m+m*n的二级指针,前m个地址分别存放后m*n个地址中每行的首地址

#include

#include

#include

//二维数组内存分配

int main()

{

int i,j,c=0; // i,j为下标,c为赋初值方便

int m,n; // m行 n列

int **p;

int *head;

scanf("%d %d",&m,&n);

p=(int **)malloc(sizeof(int *)*m+sizeof(int)*m*n);

if (p==NULL)

{

puts("memory allocation error!");

return;

}

head=(int *)p+m; //指向数据内容起始的首地址,注意地址转换

memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零

for (i=0;i

{

//p[i]=head+(i*n); //both is ok

*(p+i)=head+(i*n);

}

for(i=0;i

{

for (j=0;j

{

*(*(p+i)+j)=c++;

}

}

for(i=0;i

{

for (j=0;j

{

printf("%x: %4d\t",&p[i][j],p[i][j]);

}

printf("\n");

}

free(p);

system("pause");

return 0;

}

第一种方法需要分配m+1次内存,释放时也要先分别释放一级指针,再释放二级指针;

第三种方法分配连续的(m*n+m)*sizeof(int)个内存空间,操作较快。同时可以用p[i][j]下标方式访问。

内存分配需要用到sizeof(type); 指针加操作时 直接p+1效果为p的地址再加上sizeof(p)个字节。不能画蛇添足为p+sizeof(p)。

关键一:分配内存后必须判断是否分配成功

int *p=(int *)malloc(sizeof (int)*10);

if(p!=NULL)

// operate

关键二:分配内存 使用完成后必须释放,否则会造成内存泄露。***虽然操作系统也会对程序员申请的内存进行回收,但程序员有责任对自己申请的内存释放***。

free(p); // 腾讯上次面试 如何避免内存泄露,自己的回答是 类似写大括号 {}一样,malloc之后直接写上free();中间写自己的代码

相关推荐

五大联赛丢球最少的球队是?
365bet取款要多久到账

五大联赛丢球最少的球队是?

📅 10-01 👁️ 5965
从18岁到80岁,男性的性能力是怎样变化的?
365bet最快线路监测中心

从18岁到80岁,男性的性能力是怎样变化的?

📅 08-28 👁️ 8323
电脑通电后自动开机的主板BIOS设置方法
365BET导航

电脑通电后自动开机的主板BIOS设置方法

📅 10-16 👁️ 942
QQ炫舞手游翅膀获得大全 所有翅膀飞行效果图片一览
365bet取款要多久到账

QQ炫舞手游翅膀获得大全 所有翅膀飞行效果图片一览

📅 08-30 👁️ 6167
天谕翅膀系统详解:外观属性及获得方法一览
逆水寒手游师徒任务怎么做 逆水寒手游师徒任务攻略
365bet取款要多久到账

逆水寒手游师徒任务怎么做 逆水寒手游师徒任务攻略

📅 01-27 👁️ 8146
账户亏30%多久能回本?这是投资中很重要的问题
雅泛迪轮毂排行榜
365bet取款要多久到账

雅泛迪轮毂排行榜

📅 01-18 👁️ 7541
部编本八下语文蒹葭MP3音频【下载】
365bet取款要多久到账

部编本八下语文蒹葭MP3音频【下载】

📅 07-10 👁️ 8277
王者荣耀新启动!探索ID启动卡与NFC功能,解锁游戏新体验!
365bet取款要多久到账

王者荣耀新启动!探索ID启动卡与NFC功能,解锁游戏新体验!

📅 02-14 👁️ 6288
微信怎么能在别的手机登录
365bet取款要多久到账

微信怎么能在别的手机登录

📅 09-14 👁️ 9129
【iOS表情符號】iPhone表情符號看不到?新 Emoji 表情圖示不顯示