关于C语言 malloc申请二维数组组申请动态内存的问题

海阔凭鱼跃 天高任鸟飞
C语言内存管理主要包括malloc()、remalloc()、free()三个函数。
malloc原型&extern void *malloc(unsigned int num_bytes);
m行n列的&二维数组的分配,主要有三种方法:
一、分配一个长度为m的二级指针,指针的指向的内容分别指向一个长度为n的一位数组
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#include&math.h&
//二维数组内存分配
int main()
int i,j,c=0;
scanf("%d %d",&m,&n);
p=(int **)malloc(sizeof(int *)*m);
if (p==NULL)
puts("memory allocation error!");
//head=(int *)p+m; //指向数据内容起始的首地址
//memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零
for (i=0;i&m;i++)
//p[i]=head+(i*n);
//both is ok
*(p+i)=(int *)malloc(sizeof(int)*n);
for(i=0;i&m;i++)
for (j=0;j&n;j++)
*(*(p+i)+j)=c++;
for(i=0;i&m;i++)
for (j=0;j&n;j++)
printf("%x: %4d\t",&p[i][j],p[i][j]);
printf("\n");
for (i=0;i&m;i++)
free(p[i]);
system("pause");
二、分配一个长度为m*n的一级指针(即一维数组),通过地址转换 来模拟二维数组的行为
代码较简单,略去
三、分配一个长度为m+m*n的二级指针,前m个地址分别存放后m*n个地址中每行的首地址
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
//二维数组内存分配
int main()
int i,j,c=0; // i,j为下标,c为赋初值方便
int m,n; // m行 n列
scanf("%d %d",&m,&n);
p=(int **)malloc(sizeof(int *)*m+sizeof(int)*m*n);
if (p==NULL)
puts("memory allocation error!");
head=(int *)p+m; //指向数据内容起始的首地址,注意地址转换
memset(p,0,sizeof(int *)*m+sizeof(int)*m*n); //内存区域清零
for (i=0;i&m;i++)
//p[i]=head+(i*n);
//both is ok
*(p+i)=head+(i*n);
for(i=0;i&m;i++)
for (j=0;j&n;j++)
*(*(p+i)+j)=c++;
for(i=0;i&m;i++)
for (j=0;j&n;j++)
printf("%x: %4d\t",&p[i][j],p[i][j]);
printf("\n");
system("pause");
第一种方法需要分配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();中间写自己的代码
我参与的团队
积分与排名
评论排行榜
阅读排行榜C语言中二维数组如何申请动态分配内存_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
C语言中二维数组如何申请动态分配内存
1、使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。2、例程,分配3行4列二维数组:#include&&stdio.h&#include&&malloc.h&int&main(){&&&&int&**a;&&&&int&i,&j;&&&&a&=&(int**)malloc(sizeof(int*)*3);//为二维数组分配3行&&&&for&(i&=&0;&i&&&3;&++i){//为每列分配4个大小空间&&&&&&&&a[i]&=&(int*)malloc(sizeof(int)*4);&&&&}&&&&//初始化&&&&for&(i&=&0;&i&&&3;&++i){&&&&&&&&for&(j&=&0;&j&&&4;&++j){&&&&&&&&&&&&a[i][j]&=&i+j;&&&&&&&&}&&&&}&&&&//输出测试&&&&for&(i&=&0;&i&&&3;&++i){&&&&&&&&for&(j&=&0;&j&&&4;&++j){&&&&&&&&&&&&printf&(&%d&&,&a[i][j]);&&&&&&&&}&&&&&&&&printf&(&\n&);&&&&}&&&&//释放动态开辟的空间&&&&for&(i&=&0;&i&&&3;&++i){&&&&&&&&free(a[i]);&&&&}&&&&free(a);&&&&return&0;}/*输出:0&1&2&31&2&3&42&3&4&5*/
采纳率:70%
来自团队:
/删除由new_mat()函数创建的有rows行的二维数组s;
int j,r=5;assert.h&
putchar('typedef int em_
//数组元素的数据类型em_type **new_mat(int rows,int cols)
//%d &; j++) {
printf(&quot,fa[i][j]),释放其占用的空间{
for (i = 0;/示例;新建一个行数为
assert((rt=malloc(sizeof(em_type *)*rows))!=NULL) ;
for (i=0!=NULL);}void delete_mat(em_type **s,c=6,int rows) /&#47,列数为cols的二维数组,并返回首地址{
em_type **rt=NULL;r; i&/---------------------------------------------------------------------------#include &stdio.h& i++)
assert((rt[i]=malloc(sizeof(em_type)*cols)); i++) free(s[i]);
free(s); j&\n');
//}int main(void){ i& i++) {
em_type **
//读取fa数组中的元素
for (i = 0,新建一个有r行c列的二维数组。
fa=new_mat(r;/对fa数组进行赋值
for (i = 0; i&r; i++) {
for (j=0; j&c; j++) {
fa[i][j]=i*j;
/c;#include &stdlib,释放空间
delete_mat(fa,r); return 0;}/&#47&#47.h&#include & i&使用完毕,删除数组
表示看不懂,没这么长的吧
表示汗一下,单纯的动态分配二维数组确实没有这么长,程序中标的很清楚,动态分配二维数组的工作都是在new_mat()这个函数中完成的,其它的函数都是为了演示new_mat()的用法,delete_mat()函数是为了回收动态分配的二维数组占用的空间。因此,如果只是动态分配二维数组,只要明白new_mat()函数即可,即如下部分:em_type **new_mat(int rows,int cols)
//新建一个行数为rows,列数为cols的二维数组,并返回首地址{
em_type **rt=NULL;
assert((rt=malloc(sizeof(em_type *)*rows))!=NULL) ;
for (i=0; i& i++)
assert((rt[i]=malloc(sizeof(em_type)*cols))!=NULL);}
为您推荐:
其他类似问题
动态分配内存的相关知识
换一换
回答问题,赢新手礼包关于动态申请二维数组【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:561,037贴子:
关于动态申请二维数组收藏
为什么是个三级指针?而不是二级指针呢?p存放行地址,*P访问到行,*p[i]方位到每个字符串,怎么变成三级指针呢?#include&stdio.h&#include&stdlib.h&#include&string.h&main(){
char ***p,str[100],*q;
scanf("%d\n",&t);
p=(char ***)malloc(sizeof(char *)*t);
for(i=0;i&t;i++)
gets(str);
p[i]=(char **)malloc(sizeof(str));
strcpy(*p[i],str);
for(i=0;i&t;i++)
printf("%s",*p[i]);
free(*p+i);
自学编程,零基础怎么学习?如何系统,科学地学习编程,成为一名程序员...
三重指针,我完全招架不住啊。。。
p=(char ***)malloc(sizeof(char *)*t); /* 这一句,鄙人觉得有问题?*/
登录百度帐号推荐应用相关文章推荐
C语言中动态分配一位数组是很简单的,但是没有可以直接对二维数组进行动态分配的函数,因此,要相对二维数组动态分配内存,便要借助于一位数组来实现,具体如下:
假设要为一个n*m的二维数组分配动态内存
要完成图像的两倍线性放大,最先想到用二维数组来实现,每次插值采用时间复杂度为O(n^2)的两个for循环来实现,插几次值就OK了。做完之后,大师说这个程序还有优化的空间,因为计算机的内存时一块一维连续...
转载自http://blog.csdn.net/lavorange/article/details/
一、二维数据的内存空间动态分配
void malloc2D...
C/C++中的二维数组动态内存分配与释放
//二维数组动态数组分配和释放
//数组指针的内存分配和释放
char (*a)[N];//指向数组的指...
malloc 和 realloci
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 malloc申请二维数组 的文章

 

随机推荐