免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2582 | 回复: 16
打印 上一主题 下一主题

[C] malloc遇到的问题,请大家帮助了 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-17 12:14 |只看该作者 |倒序浏览
大家试一下吧第8行的 malloc(6 分别改成 malloc(0)和 malloc(69) 运行一下,看看有什么不同的输出结果吧,不知道为什么会出现不同的输出结果,请各位支招了 。。。谢谢啦!!!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(void)
{
        char *s;
        s = malloc(6;
        strcpy(s,"hello";
        printf("%s\n",s);
        free(s);
        printf("%s\n",s);
        if (s != NULL) {
                strcat(s,"world";
                printf("%s\n",s);
        }
        return 0;
}

现在没分了,对不住大家了。。。

[ 本帖最后由 youzj326 于 2009-9-17 12:25 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-09-17 12:45 |只看该作者
11行你都free了,怎么后面还用?

论坛徽章:
0
3 [报告]
发表于 2009-09-17 12:47 |只看该作者

回复 #2 woshizzb 的帖子

我就是想看看free后到底发生了什么 ,现在是68是个分界线,分配68个字节一下的空间跟超过68个字节的空间后 free掉之后的输出结果不一样 。。。诧异

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2009-09-17 12:57 |只看该作者

回复 #3 youzj326 的帖子

这没什么意义。malloc从堆上分配内存,free后这些内存就被操作系统回收。一般操作系统只是被这些内存标记为可用,而不去改变内容,所以这些内存的内容是否会被改变就要看操作系统有没有再用这些内存了。

论坛徽章:
0
5 [报告]
发表于 2009-09-17 13:06 |只看该作者

回复 #4 woshizzb 的帖子

是这样子的,但是你运行下程序看一下结果,在68和69的时候有个分水岭,每次运行都是这样,并且我在好多台机子上运行都是这样,总是会有点原因吧。。。

论坛徽章:
0
6 [报告]
发表于 2009-09-17 13:10 |只看该作者
man malloc:
       malloc()  allocates  size  bytes and returns a pointer to the allocated memory.  The memory is not cleared.  If
       size is 0, then malloc() returns either NULL, or a unique pointer value that can later be  successfully  passed
       to free().

size 0 合法的.
如果不是NULL,也能被free.
我想可能malloc(0),也生成了一条记录,只不过可用空间为0.

[ 本帖最后由 epegasus 于 2009-9-17 13:19 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-09-17 13:18 |只看该作者

回复 #6 epegasus 的帖子

恩 现在的情况是malloc(0)的结果跟malloc(6及其68个字节一下的运行结果都一样,但是malloc(69)及其69以上的结果就是另外一种情况了,很诡异,不知到为什么。。。我在很多机子上都试过了 都是这样的。。。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2009-09-17 13:20 |只看该作者

回复 #5 youzj326 的帖子

的确,我这也是这样。

论坛徽章:
0
9 [报告]
发表于 2009-09-17 13:33 |只看该作者
继续等待高手明示了。。。

论坛徽章:
0
10 [报告]
发表于 2009-09-17 13:38 |只看该作者
是这样的,用gdb看的结果是当malloc的空间<=68字节的时候free()之后前4字节被填上了'\0',当申请的空间>=69的时候free()之后则不会。所以才会出现不同的结果,可是为什么会这样呢,等待高手解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP