一个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错误已经很客气了~
[解决办法]
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
[解决办法]
往野指针里面写东西,结果很难说的。