33,318
社区成员
发帖
与我相关
我的任务
分享
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);


[/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]
你从文件里读出来的内容,把原本应该用来保存你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]还以为这里的&也可以,原来是你弄错了
[/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]
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
[/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)时,倒是如常运行,并没有中止
[/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]
你从文件里读出来的内容,把原本应该用来保存你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]
b成了野指针,意图释放一个野指针,当然会崩溃 至于free的意义的话,将将要free掉的那块内存标记为可用 就是改变操作系统中空闲链表 [/quote]
刚刚试了试,果然位置不是指向malloc的,那它变成了指向fscanf所输入的容里面的吗?
大小是多少?还是根据输入的数量决定?
感觉的malloc对它变得没有意义了 0口0...[/quote]
b的值就是你fscanf()到b里面的值 fscanf(as,"%s",&b);b的值取决于你从as那边读了什么东西到b中。因此b指向的内存是不确定的,b就是一个野指针[/quote]
那读取的空间,是取决于哪里?
还是输入多少就读多少?
[/quote]
你从文件里读出来的内容,把原本应该用来保存你malloc出来的内存空间地址的值给覆盖掉了
所以你再free(b)的时候,b指向的地址值不是malloc的出来的地址了,而是你读出来的内容!
所以free的时候已经不是malloc出来的内存空间了,所以出问题了!
fscanf(as,"%s",b); //这样就好了!后面free(b)就不会有问题啦!
[/quote]
还有一个问题,@lin5161678解释了,是因为你使用fscanf(as,"%s",&b);这句,将b的指针值修改了,所以free(b)并不是释放的是malloc的地址,而是一个错误的地址,你可以打印看b这值,看看分配后的值,与运行fscanf(as,"%s",&b)后,b的值变化了。