首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个free函数的有关问题,帮看看

2012-06-19 
一个free函数的问题,帮看看。#include stdio.h#include stdlib.h#include string.hvoid Test(void){c

一个free函数的问题,帮看看。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void Test(void)
{
char *str = (char *) malloc(100);
//printf("%d\n",sizeof(str));
strcpy(str, "hello");
free(str);
//printf("%d\n",sizeof(str));
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main(void)
{
Test();
return 0;
}

我想问一下1.为什么加上加了注释的那两个句子后输出是:
4
4
world
2.而去掉加了注释的那两句,结果是很多“屯”,然后是空格再到“prees any key to continue”
为什么第一种情况会输出word,而第二种情况没输出world却输出了很多屯呢?


[解决办法]
你确定运行没有出错?
free后指针不一定肯定是NULL哦亲
free只是释放指针指向的内存而已
[解决办法]
玩野指针啊,木有意义啦,完全依赖于你程序运行的堆和堆栈环境,随即的哦,不直接报出PG错误已经很客气了~
[解决办法]

C/C++ code
void Test(void){    char *str = (char *) malloc(100);    printf("%x\n",str);//打印地址    strcpy(str, "hello");    free(str);    printf("%x\n",str);//你就会发现free以后地址没变,就是所谓的“野指针”,所以大神们都说free完了最好给它赋值NULL,即str = NULL;    /*if(str != NULL)//否则,野指针指向的内存以及释放了,再strcpy,居然不出错?    {        strcpy(str, "world");        printf(str);    }*/}
[解决办法]
我用gcc编译器也会出现你的问题,用BCB/VS的话能出现world
你这个已经free掉了,会变为野指针,如果在strcpy会出现意想不到的错误
[解决办法]
free仅仅是释放掉了指针所指向的内存,标示该内存可以被再次malloc,如果free之后没有将指针赋为NULL,而再次使用该野指针,结果就取决于这块内存有没有被再次分配出去了。。。
[解决办法]
1.
char *str
str是一个指针,指针在编译器理解起来就是一个unsigned long,用sizeof当然是4
free函数很郁闷了额,因为采用不同的堆策略,可能free实现不一样,<c++标准库>里的作者实现,是采用从开始到最后依次分配,直到用完才去真正释放的空间,所以即使free立即释放了,但是刚刚的空间依然在,所以word能够输出来
这是一种不好的编程风格,free后立即应置指针为NULL,防止二次释放
2.sizeof的实现我忘了,回答不上,sorry
[解决办法]
往野指针里面写东西,结果很难说的。

热点排行