好问题!~
点赞  2011-4-22 20:13
实际上这里的问题不仅仅是浪费了10个字节的内存,更严重的是你泄漏了刚刚申请的字节堆内存。更更严重的是你可能马上会执行free(p)操作,这几乎肯定会让你的程序报出一个“段错误”而退出。最最严重的是你可能忘了调用free(p)操作,给你的程序留下一个bug,最终客户或老板找上了你!
点赞  2011-4-22 20:16

回复 18楼 txyugood 的帖子

这个问题我早就知道,只是想让大家加深下印象,22楼回答的和我想的一样!~
QQ:1625345502
点赞  2011-4-22 20:19

回复 22楼 meihuan 的帖子



厉害!~
QQ:1625345502
点赞  2011-4-22 20:19
学习了!!C还没学好
点赞  2011-4-22 20:29

回复 25楼 fxw451 的帖子

不是没学好,可能想问题的角度不一样,而且平时做的方向不同而已 呵呵!~
QQ:1625345502
点赞  2011-4-22 22:17
呵呵,你们还厉害啊,太自卑了,哎。。
广交朋友!!!
点赞  2011-4-23 11:03

强悍

平时老在单片机上写些简单的c程序,这下开了眼界了。
谭宇
点赞  2011-4-23 11:07
malloc是为谁分配的。要明白这一点。
点赞  2011-4-23 12:07
高手真多啊 哈哈
点赞  2011-4-23 12:29

第一:采用malloc分配空间后,应判断分配的空间是否为空。 char *p=(char *)malloc(sizeof(char)*10); if ( p == NULL ) exit(0);

 

第二:应用free释放malloc分配的空间。

 

呃,还有内存泄露的问题,没注意到。

[ 本帖最后由 swfc_qinmm 于 2011-4-23 15:15 编辑 ]
点赞  2011-4-23 15:03
malloc分配的空间是在堆上,但p指针本身是在栈上
点赞  2011-4-23 21:46
int * p = (int *)malloc(sizeof(int));分配4个字节的内存.
p已经越界了
点赞  2011-4-23 21:47
char *p=(char *)malloc(sizeof(char)*10);分配4个字节的内存.
p="hello";p已经越界了
点赞  2011-4-23 21:49

回复 22楼 meihuan 的帖子

偶然来到这里,才注册,分都被加完了,但我还想要点分...所以尝试从得分者的回答中发掘点东西:
1)“p=(char *)malloc(sizeof(char)*10)中的分配有可能不成功所以要先判断 if(p == NULL)printf("memory is not ......."),分配不成功就返回。”
-------NULL 需要事先定义(小问题)
-------malloc函数必须在申请不到空间时,返回NULL
-------不一定printf,也不一定exit,实际可根据具体情况处理(例如释放或整合一些空间)
-------如果需要管理虚拟内存,有可能需要PageLock,再处理,当然free前也要Unlock

2)"第二呢独立的说p是一个已经声明的字符指针,同样的“hello”也是指针,是可以赋值,但“hello”的存储不需要另外一个字符数组,只用声明一个字符指针就行!而你却分配了十个指向字符的指针的空间,字符和字符串不一样。"
-------这要具体看原代码用意,或许作者想先“hello”,而后由其它渠道确定再接“ man”还是“ pig”,分配10个也合适
-------"hello"一般来说是存在代码段的一串固定字符,具体赋值处理和编译器相关

3)“如果像楼主题中这样malloc之后再把"hello"的地址赋值给p,malloc申请的空间的首地址就丢了,不能free了,内存泄露。。。。”
-------不能free不至于内存泄露,只能说成了占地方的垃圾

4)“实际上这里的问题不仅仅是浪费了10个字节的内存,更严重的是你泄漏了刚刚申请的字节堆内存。更更严重的是你可能马上会执行free(p)操作,这几乎肯定会让你的程序报出一个“段错误”而退出。最最严重的是你可能忘了调用free(p)操作,给你的程序留下一个bug,最终客户或老板找上了你”
--------不至于内存泄露,的确是浪费,但如果操作系统有更好的处理,也可能无需free而自动回收
--------free(p)的具体处理看编译,不过确实“hello”被加载在stack的可能性大,所以,编译时或许能发现这个错误
--------没有free(p)不会造成实质性BUG,只是浪费内存空间,因为只有10个CHAR,几乎没什么事情会让客户或老板为此来找你。

好了,就这些....看楼主的意思了...
近来被黑帮加害,工作无着,看看哪位给俺推荐份工作哈,SCH/PCB/C/C++/VB/AVR/ARM7/ARM9/C51/S3C全能搞定,E6级,10年以上经验,希望¥>6500
点赞  2011-4-23 23:24
没有检查动态分配是否成功。
点赞  2011-4-23 23:50

回复 35楼 bestart 的帖子

当然,如果这段代码被多次执行,内存资源会不断蚕食,以至程序无法继续运行。

系统自动回收需要编译器配合且有可能提供的是虚拟或动态地址。

[ 本帖最后由 bestart 于 2011-4-24 13:34 编辑 ]
点赞  2011-4-24 02:22
如果申请内存失败呢?
这样应该要好点
#include

char *p=NULL;
if(p=(char *)malloc(sizeof(char)*10)==NULL)
{
        exit(0);
}
else
{
       p="hello";
}
点赞  2011-4-27 22:21
p="hello";
这句出了问题,指针p已经动态分配了空间,但是现在又让它指向一个字符串常量,导致前面分配空间的指针丢失,后面就无法释放内存了
点赞  2011-4-28 08:03
这贴看的云里雾里的,  俺的学习空间还很大啊
点赞  2011-4-29 09:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复