免费注册 查看新帖 |

Chinaunix

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

这个程序为什么是对的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-13 13:27 |只看该作者 |倒序浏览
void Test(void)
{
    char *str = (char *) malloc(100);
    strcpy(str, "hello");
    free(str);
    if(str != NULL){
        strcpy(str, "world");
        printf(str);
    }
}

free已经将str指向内存区域释放了, 这样strcpy执行的时候应该发生错误才对呀,结果我在发现在GCC, VC6.0, TC3.0上运行都没有错,基本排除了编译器的原因.
百思不得其解! 这实在出乎我的预料.

论坛徽章:
0
2 [报告]
发表于 2005-11-13 13:44 |只看该作者
我的理解是:
free(str)没有改变str的值,也就是说虽然释放了malloc的内存的,但是str仍然指向那块已经释放了的内存。这也就是为什么一般free(void *str)后要设置str = NULL。

论坛徽章:
0
3 [报告]
发表于 2005-11-13 14:17 |只看该作者
#include<stdio.h>
#include<alloc.h>
#include<string.h>

void Test(void)
{
    char *str = (char *) malloc(100);
    printf("%xn",str);
    printf("%sn",str);
    strcpy(str, "hello");
    printf("%xn",str);
    printf("%sn",str);
    free(str);
    printf("%xn",str);
    printf("%sn",str);
    if(str != NULL)
   {
           strcpy(str, "world");
           printf("%xn",str);
           printf(str);
    }
}

void main()
{
        Test();
}
看看输出就知道为什么了

论坛徽章:
0
4 [报告]
发表于 2005-11-13 14:52 |只看该作者
原帖由 zh_manyu 于 2005-11-13 14:17 发表
#include<stdio.h>
#include<alloc.h>
#include<string.h>

void Test(void)
{
    char *str = (char *) malloc(100);
    printf("%xn",str);
    printf("%sn" ...



     我在GCC下面打印过str的值,发现malloc分配的区域全是0(这里就是100个0),然后跟一个标志后(我的理解),后面又全是0。malloc到底是回事?
   
    按照我以前的理解,free str指向的区域后,str应该是个指向非法地址的指针,可现在看来似乎不是这么回事。
    你能详细的解释一下吗?

1.JPG (39.39 KB, 下载次数: 13)

1.JPG

论坛徽章:
0
5 [报告]
发表于 2005-11-13 15:14 |只看该作者
我还没见过哪个版本的free实现了释放之后会把指针置空的。
正常写程序free之后一定要 把指针赋值NULL;
这样以后判断指针是否有效才有意义。

论坛徽章:
0
6 [报告]
发表于 2005-11-13 15:15 |只看该作者
对不起,您填写的内容(如签名、帖子、短消息等)包含不良内容而无法提交,请返回修改。

[ 点击这里返回上一页 ]

不知道回帖也有罪啊?
我只是想吧内容回复出来

论坛徽章:
0
7 [报告]
发表于 2005-11-13 15:17 |只看该作者
原帖由 1jjk 于 2005-11-13 02:15 发表
对不起,您填写的内容(如签名、帖子、短消息等)包含不良内容而无法提交,请返回修改。

[ 点击这里返回上一页 ]

不知道回帖也有罪啊?
我只是想吧内容回复出来


我曾经试图复制 g++ -version 都被指包含“不良内容”。

论坛徽章:
0
8 [报告]
发表于 2005-11-13 15:23 |只看该作者
楼上的程序,有点不明白

程序里只有8处输出,
编译后怎么有10处输出呢?

请解释一下,好吗?

论坛徽章:
0
9 [报告]
发表于 2005-11-13 20:57 |只看该作者
原帖由 心如野鹿迹如萍 于 2005-11-13 15:23 发表
楼上的程序,有点不明白

程序里只有8处输出,
编译后怎么有10处输出呢?

请解释一下,好吗?



我添加了两句打印打字符
"After strcpy"之类的,并把%xn改成了%xn

论坛徽章:
0
10 [报告]
发表于 2005-11-13 21:02 |只看该作者
原帖由 deathbravo 于 2005-11-13 15:14 发表
我还没见过哪个版本的free实现了释放之后会把指针置空的。
正常写程序free之后一定要 把指针赋值NULL;
这样以后判断指针是否有效才有意义。


我的意思是,既然已经free了,那么那片区域就不应该还能"合法"的访问,虽然指针仍然是指向那里.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP