| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 783 人关注过本帖
标题:请教大家一个关于malloc的问题,谢谢
只看楼主 加入收藏
刮目相看
Rank: 2
等 级:论坛游民
帖 子:25
专家分:30
注 册:2009-11-23
结帖率:50%
收藏
 问题点数:0 回复次数:5 
请教大家一个关于malloc的问题,谢谢
大家好,我的问题如下:
int **c=(int **)malloc(sizeof(int *)*81);
c[0]=(int *)malloc(sizeof(int)*9);

首先我声明并初始了一个int **c,然后,我只把c[0]初始化了,剩余c[1]~c[80]都没有初始

就是说c[0]指向了一个含有9个整形元素的一维数组,但是c[1]由于没有初始化,所以无法预计它指向什么。

我想知道初始化的和没有初始化的有什么区别?

sizeof(c[0])和sizeof(c[1])用整型输出得到一样的值,是4,这个我明白,因为是整形指针。

那么,可以用sizeof函数来区别c[0]and c[1]么?

谢谢大家
搜索更多相关主题的帖子: malloc 
2009-11-23 06:13
限量版猪头
Rank: 2
等 级:论坛游民
威 望:1
帖 子:165
专家分:30
注 册:2006-2-5
收藏
得分:0 
这样用法还第一次看到。呵呵

所谓初始化和未初始化,涉及到内存管理机制(有很多)。

但是基本原理差不多,具体你可以参考操作系统相关的书,我就不多说了。

其中有一种情况,你申请的内存,是上次申请后释放(即返回给操作系统的内存管理的),但是你并不能保证上次返还给操作的那个内存块是全部为0的,

即你申请的内存,并不能保证内容全部为0,而一旦内容不为空,对于指针来说,就是有个指向的目标了。但你的目的肯定是对于刚申请的指针是为NULL的。

因此对于刚申请的内存,一般都要执行一下memset

那么,可以用sizeof函数来区别c[0]and c[1]么?

没明白啥意思

2009-11-23 11:42
xy4919961
Rank: 5Rank: 5
等 级:职业侠客
帖 子:199
专家分:362
注 册:2009-10-24
收藏
得分:0 
要想对刚刚malloc分配的内存初始化.改你的应该是
  memset(c,'\0',0);
确实要用memset()函数.给你个例子:
#include<stdio.h>
main()
{
  char *sum="This is apple";
   memset(sum,'a',6);  /* 对前6个初始化位a.*/
   printf("%s",sum);
    getch();
     return 0;
}

[ 本帖最后由 xy4919961 于 2009-11-23 17:23 编辑 ]

QQ群:96348241
2009-11-23 17:22
刮目相看
Rank: 2
等 级:论坛游民
帖 子:25
专家分:30
注 册:2009-11-23
收藏
得分:0 
回2楼朋友:
int **c=(int **)malloc(sizeof(int *)*81);
for(i=0;i<81;i++)
c[i]=(int *)malloc(sizeof(int)*9);

我这么做,是不是将c[0]~c[80]这81个指针初始化了?

其实,我的问题是,首先,声明一个int **c,使其指向一个指针数组(含有81个指针,但还没有初始化),然后,我要遍历一个9*9数组,如果遇到的元素等于零,如果第5个元素非零,那么我就做c[4]=(int *)malloc(sizeof(int)*9);如果遇到的元素非零,我就不想分配给对应c[i]空间,为了节约内存。请问该如何实现呢?

最后那个问题是,比如我对c[4]这个指针做了c[4]=(int *)malloc(sizeof(int)*9);,然后对c[5]什么都没做,那么c[4]和c[5]可以用sizeof来区别?因为sizeof(c[4])和sizeof(c[5])的值都是4啊。

不知道我说清楚没,也请其他看到的朋友帮忙解答下,非常感谢。

2009-11-23 17:42
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:0 
int **c=(int **)malloc(sizeof(int *)*81); 分配81个指针给c,
for(i=0;i<81;i++)
  c[i]=NULL;
81个指针都是空NULL(0值)。
假如c[0]~c[4]都分配了空间,c[0]~c[4]都有个地址值,非空NULL,而下一个c[5]值还是空NULL(0值)。
这样你可以用if语句来判断当前处理的指针是否分配过空间。
if(!c[i])
  c[i]=(int *)malloc(sizeof(int)*9);

[ 本帖最后由 UserYuH 于 2009-11-23 18:27 编辑 ]

努力—前进—变老—退休—入土
2009-11-23 18:15
xy4919961
Rank: 5Rank: 5
等 级:职业侠客
帖 子:199
专家分:362
注 册:2009-10-24
收藏
得分:0 
5楼正解..

QQ群:96348241
2009-11-23 18:30
快速回复:请教大家一个关于malloc的问题,谢谢
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044393 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved