唷!我又来问问题了!这次是free()的

笨蛋琪露諾 2013-10-19 09:20:34

char *b=(char *)malloc(100);
char *c=b;
FILE *as;
as=fopen("log","r");
c=(char *)&b;
do{
fscanf(as,"%s",&b);
printf("%s\n",c);
fflush(stdin);
}while(!feof(as));
fclose(as);
free(c);


重点是在最后,能用free(c)
但当用free(b)时,就会crash掉了!!
这是什么回事?!

话说.....
当我调用已经被free掉的数据,数据依然在...
那我到底是有没有把它们释放...
...全文
381 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
笨蛋琪露諾 2013-10-20
  • 打赏
  • 举报
回复
成功能free了!! 谢谢各位的回答
笨蛋琪露諾 2013-10-20
  • 打赏
  • 举报
回复
引用 23 楼 max_min_ 的回复:
[quote=引用 16 楼 u011649187 的回复:] [quote=引用 14 楼 max_min_ 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] 你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了 所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容! 所以free的时候已经不是malloc出来的内存空间了,所以出问题了! fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦! [/quote] 呜呜呜......我快疯了...快又搞不清b跟&b的意思了... fscanf("%s",&b);不是将数据存到b指标地址吗?不是存放到的malloc里的空间吗? 而b自身不是作为指标的大小吗? 如果将内容存到... 那...... 其实char b [20];跟char *b=malloc(20); 差异在哪... 如果要放进数据,什么时候该用&b,什么时候该用b?[/quote] char *b = (char*)malloc(1000); b是指向了malloc分配的内存空间的首地址了,你每次使用malloc这块内存空间的话,直接调用b就好了 &b是b这个指针本身直接存放的内存地址的!4个字节大小而已![/quote] 原来如此0口0!!我把&b的跟b调乱了!!
笨蛋琪露諾 2013-10-20
  • 打赏
  • 举报
回复
引用 22 楼 lcmzgy 的回复:
vc6.0是会终止的,你自己看一下也就懂了,c=(char *)&b;,b和c都是char * 类型的,你对b取地址,得到的就是指向char *的指针了,char **类型,c得到到的值是b这个局部对象在内存栈的地址,你free(c),明显是错误的,free()只能释放malloc出来的堆内存,malloc什么,才有free什么,一一对应
VC的话,我倒是一直卡在fscanf,fopen跟feof c=(char *)&b;也是通过了
7823356 2013-10-20
  • 打赏
  • 举报
回复
刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...
7823356 2013-10-20
  • 打赏
  • 举报
回复
刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...
lin5161678 2013-10-20
  • 打赏
  • 举报
回复
free的意义在于 free之后 重新malloc 有可能得到free掉的内存 如果一直不free 那么malloc 一直拿不到那块内存
lsjfdjoijvtghu 2013-10-20
  • 打赏
  • 举报
回复
引用 25 楼 u011649187 的回复:
[quote=引用 23 楼 max_min_ 的回复:] [quote=引用 16 楼 u011649187 的回复:] [quote=引用 14 楼 max_min_ 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] 你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了 所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容! 所以free的时候已经不是malloc出来的内存空间了,所以出问题了! fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦! [/quote] 呜呜呜......我快疯了...快又搞不清b跟&b的意思了... fscanf("%s",&b);不是将数据存到b指标地址吗?不是存放到的malloc里的空间吗? 而b自身不是作为指标的大小吗? 如果将内容存到... 那...... 其实char b [20];跟char *b=malloc(20); 差异在哪... 如果要放进数据,什么时候该用&b,什么时候该用b?[/quote] char *b = (char*)malloc(1000); b是指向了malloc分配的内存空间的首地址了,你每次使用malloc这块内存空间的话,直接调用b就好了 &b是b这个指针本身直接存放的内存地址的!4个字节大小而已![/quote] 原来如此0口0!!我把&b的跟b调乱了!![/quote]还以为这里的&也可以,原来是你弄错了
sige1111 2013-10-20
  • 打赏
  • 举报
回复
这个下载要积分
max_min_ 2013-10-19
  • 打赏
  • 举报
回复
引用 16 楼 u011649187 的回复:
[quote=引用 14 楼 max_min_ 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] 你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了 所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容! 所以free的时候已经不是malloc出来的内存空间了,所以出问题了! fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦! [/quote] 呜呜呜......我快疯了...快又搞不清b跟&b的意思了... fscanf("%s",&b);不是将数据存到b指标地址吗?不是存放到的malloc里的空间吗? 而b自身不是作为指标的大小吗? 如果将内容存到... 那...... 其实char b [20];跟char *b=malloc(20); 差异在哪... 如果要放进数据,什么时候该用&b,什么时候该用b?[/quote] char *b = (char*)malloc(1000); b是指向了malloc分配的内存空间的首地址了,你每次使用malloc这块内存空间的话,直接调用b就好了 &b是b这个指针本身直接存放的内存地址的!4个字节大小而已!
lcmzgy 2013-10-19
  • 打赏
  • 举报
回复
vc6.0是会终止的,你自己看一下也就懂了,c=(char *)&b;,b和c都是char * 类型的,你对b取地址,得到的就是指向char *的指针了,char **类型,c得到到的值是b这个局部对象在内存栈的地址,你free(c),明显是错误的,free()只能释放malloc出来的堆内存,malloc什么,才有free什么,一一对应
笨蛋琪露諾 2013-10-19
  • 打赏
  • 举报
回复
引用 20 楼 lcmzgy 的回复:
什么编译器什么系统
win7 32bits Dev C++(gcc-g++)
lcmzgy 2013-10-19
  • 打赏
  • 举报
回复
什么编译器什么系统
笨蛋琪露諾 2013-10-19
  • 打赏
  • 举报
回复
引用 17 楼 lcmzgy 的回复:
[quote=引用 15 楼 u011649187 的回复:] [quote=引用 11 楼 lcmzgy 的回复:] [quote=引用 8 楼 u011649187 的回复:] [quote=引用 5 楼 lcmzgy 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] b成了野指针,意图释放一个野指针,当然会崩溃 至于free的意义的话,将将要free掉的那块内存标记为可用 就是改变操作系统中空闲链表 [/quote] 刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...[/quote] b的值就是你fscanf()到b里面的值 fscanf(as,"%s",&b);b的值取决于你从as那边读了什么东西到b中。因此b指向的内存是不确定的,b就是一个野指针[/quote] 那读取的空间,是取决于哪里? 还是输入多少就读多少?[/quote] 能说下这段程序的目的是干嘛的吗? c=(char *)&b; 这句是什么意思,将b的地址(char * *)转化成char *,你要干嘛。最后free(c)其实也是错的,程序照样会非正常终止[/quote] 我这是用作读取一个文件的字串内容, 并试着建一个c指标取代b, 再释放b
笨蛋琪露諾 2013-10-19
  • 打赏
  • 举报
回复
引用 17 楼 lcmzgy 的回复:
[quote=引用 15 楼 u011649187 的回复:] [quote=引用 11 楼 lcmzgy 的回复:] [quote=引用 8 楼 u011649187 的回复:] [quote=引用 5 楼 lcmzgy 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] b成了野指针,意图释放一个野指针,当然会崩溃 至于free的意义的话,将将要free掉的那块内存标记为可用 就是改变操作系统中空闲链表 [/quote] 刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...[/quote] b的值就是你fscanf()到b里面的值 fscanf(as,"%s",&b);b的值取决于你从as那边读了什么东西到b中。因此b指向的内存是不确定的,b就是一个野指针[/quote] 那读取的空间,是取决于哪里? 还是输入多少就读多少?[/quote] 能说下这段程序的目的是干嘛的吗? c=(char *)&b; 这句是什么意思,将b的地址(char * *)转化成char *,你要干嘛。最后free(c)其实也是错的,程序照样会非正常终止[/quote] 但我用free(c)时,倒是如常运行,并没有中止
lcmzgy 2013-10-19
  • 打赏
  • 举报
回复
引用 15 楼 u011649187 的回复:
[quote=引用 11 楼 lcmzgy 的回复:] [quote=引用 8 楼 u011649187 的回复:] [quote=引用 5 楼 lcmzgy 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] b成了野指针,意图释放一个野指针,当然会崩溃 至于free的意义的话,将将要free掉的那块内存标记为可用 就是改变操作系统中空闲链表 [/quote] 刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...[/quote] b的值就是你fscanf()到b里面的值 fscanf(as,"%s",&b);b的值取决于你从as那边读了什么东西到b中。因此b指向的内存是不确定的,b就是一个野指针[/quote] 那读取的空间,是取决于哪里? 还是输入多少就读多少?[/quote] 能说下这段程序的目的是干嘛的吗? c=(char *)&b; 这句是什么意思,将b的地址(char * *)转化成char *,你要干嘛。最后free(c)其实也是错的,程序照样会非正常终止
笨蛋琪露諾 2013-10-19
  • 打赏
  • 举报
回复
引用 14 楼 max_min_ 的回复:
[quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] 你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了 所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容! 所以free的时候已经不是malloc出来的内存空间了,所以出问题了! fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦! [/quote] 呜呜呜......我快疯了...快又搞不清b跟&b的意思了... fscanf("%s",&b);不是将数据存到b指标地址吗?不是存放到的malloc里的空间吗? 而b自身不是作为指标的大小吗? 如果将内容存到... 那...... 其实char b [20];跟char *b=malloc(20); 差异在哪... 如果要放进数据,什么时候该用&b,什么时候该用b?
笨蛋琪露諾 2013-10-19
  • 打赏
  • 举报
回复
引用 11 楼 lcmzgy 的回复:
[quote=引用 8 楼 u011649187 的回复:] [quote=引用 5 楼 lcmzgy 的回复:] [quote=引用 4 楼 u011649187 的回复:] [quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] b成了野指针,意图释放一个野指针,当然会崩溃 至于free的意义的话,将将要free掉的那块内存标记为可用 就是改变操作系统中空闲链表 [/quote] 刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗? 大小是多少?还是根据输入的数量决定? 感觉的malloc对它变得没有意义了 0口0...[/quote] b的值就是你fscanf()到b里面的值 fscanf(as,"%s",&b);b的值取决于你从as那边读了什么东西到b中。因此b指向的内存是不确定的,b就是一个野指针[/quote] 那读取的空间,是取决于哪里? 还是输入多少就读多少?
max_min_ 2013-10-19
  • 打赏
  • 举报
回复
引用 4 楼 u011649187 的回复:
[quote=引用 1 楼 lin5161678 的回复:] fscanf(as,"%s",&b); b已经不是指向malloc的返回值了
能不能详细解释一下? 大概也知道是关于这句的问题 但是就是想不出实际原因[/quote] 你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了 所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容! 所以free的时候已经不是malloc出来的内存空间了,所以出问题了! fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦!
碼上道 2013-10-19
  • 打赏
  • 举报
回复
引用 10 楼 u011649187 的回复:
[quote=引用 9 楼 jerry_dqh 的回复:] [quote=引用 7 楼 u011649187 的回复:] [quote=引用 6 楼 jerry_dqh 的回复:] [quote=引用 3 楼 u011649187 的回复:] [quote=引用 2 楼 jerry_dqh 的回复:] 话说..... 当我调用已经被free掉的数据,数据依然在... 那我到底是有没有把它们释放... 》》free掉,不表示那块被释放的内存被清0了,不一定。
那...free的意义何在?[/quote] free表示这块内存自由了,可以被其他地方使用了。但是这块内存中的内容不会被清除,最后使用是什么样的,还是什么样子的。[/quote] 意思是不是? 如果A程式free之后,有其他程式调用到那个位置的记忆体,改写了它 A程式再调用该参数,内容会不一样吗? 而不free,就不会被其他程式改写?[/quote] 不free,你就有这块内存的占有权,相当于你有房产证,这块地你完全使用,其他人不会使用。free了,说明你不要这个房子,房产证可以给别人了。 如果A程式free这后,这块内存你就不再使用了,虽然你能通过指针继续使用,但是这个指针属于野指针了。如果这块释放的内存没有别人用上,可能还不会出问题,但是如果别人也用了这块内存,就有问题了。因为你free了,其他程式可能会使用的。[/quote] 嗯,理解了!非常清楚! 谢谢大大,等另一个问题也解决了就可以结帖了 [/quote] 还有一个问题,@lin5161678解释了,是因为你使用fscanf(as,"%s",&b);这句,将b的指针值修改了,所以free(b)并不是释放的是malloc的地址,而是一个错误的地址,你可以打印看b这值,看看分配后的值,与运行fscanf(as,"%s",&b)后,b的值变化了。
  • 打赏
  • 举报
回复
free就代表着,那片内存已不在你的程序的掌控之中了.里面还有什么并不重要.
加载更多回复(11)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧