实际上这里的问题不仅仅是浪费了10个字节的内存,更严重的是你泄漏了刚刚申请的字节堆内存。更更严重的是你可能马上会执行free(p)操作,这几乎肯定会让你的程序报出一个“段错误”而退出。最最严重的是你可能忘了调用free(p)操作,给你的程序留下一个bug,最终客户或老板找上了你!
回复 18楼 txyugood 的帖子
这个问题我早就知道,只是想让大家加深下印象,22楼回答的和我想的一样!~
回复 25楼 fxw451 的帖子
不是没学好,可能想问题的角度不一样,而且平时做的方向不同而已 呵呵!~
强悍
平时老在单片机上写些简单的c程序,这下开了眼界了。
第一:采用malloc分配空间后,应判断分配的空间是否为空。 char *p=(char *)malloc(sizeof(char)*10); if ( p == NULL ) exit(0);
第二:应用free释放malloc分配的空间。
呃,还有内存泄露的问题,没注意到。
[
本帖最后由 swfc_qinmm 于 2011-4-23 15:15 编辑 ]
malloc分配的空间是在堆上,但p指针本身是在栈上
int * p = (int *)malloc(sizeof(int));分配4个字节的内存.
p已经越界了
char *p=(char *)malloc(sizeof(char)*10);分配4个字节的内存.
p="hello";p已经越界了
回复 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
回复 35楼 bestart 的帖子
当然,如果这段代码被多次执行,内存资源会不断蚕食,以至程序无法继续运行。
系统自动回收需要编译器配合且有可能提供的是虚拟或动态地址。
[
本帖最后由 bestart 于 2011-4-24 13:34 编辑 ]
如果申请内存失败呢?
这样应该要好点
#include
char *p=NULL;
if(p=(char *)malloc(sizeof(char)*10)==NULL)
{
exit(0);
}
else
{
p="hello";
}
p="hello";
这句出了问题,指针p已经动态分配了空间,但是现在又让它指向一个字符串常量,导致前面分配空间的指针丢失,后面就无法释放内存了