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

free疑义

2013-04-20 
free疑问#includestdio.h#include stdlib.h#includestring.hint main(){char *strNULL char *p

free疑问


      #include<stdio.h>
      #include <stdlib.h>
      #include<string.h>
      int main()
      {
         char *str=NULL;
 char *p = NULL;
         str=calloc(10,sizeof(char));
         strcpy(str,"Hel");
         printf("String is %s\n",str);
 printf("sizeof(str) = %d\n",sizeof(str));
 printf("strlen(str) = %d\n",strlen(str));
 p = (char *)(4391232);
 printf("*p = %c\n",*p);
 printf("&str = %d\n",str);
         free(str);
 printf("*p = %c\n",*p);//在这儿已经不能访问那个内存地址的数据了。
 str = NULL;
 printf("String is %s\n",str);
         return 0;
      }

程序运行结果如下:
String is Hel
sizeof(str) = 4
strlen(str) = 3
*p = H
&str = 4391232
*p = ?
String is (null)
printf("*p = %c\n",*p); //在这儿已经不能访问那个内存地址的数据了。这条指令输出地内容是*p = ?,而在free之前它是可以输出字符串的第一个字符H的。
    在这儿我有个疑问,就是在free之后,为什么就不能访问地址4391232那一块的内容了呢。我原来理解是free之后,指针里面的地址值不会变,指针所指向的那块内存的内容也没变,只是该指针不能再继续指向和访问那块内存空间了。
    这个题目中,我是把用另外一个指针指向该地址,free掉之后为什么还是不能访问呢,我已经不是用原来的指针来访问那块内存了,而是用了一个新的指针来访问被释放的那块内存。

[解决办法]
free掉再访问,是未定义的形为,并不是说内存里肯定不变。
所以free掉再访问,变、不变、崩溃,都不奇怪
这很大程序上依赖于运行库的实现,
比如 free 函数实现时,可能会在内存中写入释放标记
用谎言去验证谎言,得到的一定是谎言
[解决办法]
引用:
free掉再访问,是未定义的形为,并不是说内存里肯定不变。
所以free掉再访问,变、不变、崩溃,都不奇怪
这很大程序上依赖于运行库的实现,
比如 free 函数实现时,可能会在内存中写入释放标记
用谎言去验证谎言,得到的一定是谎言


大才!最后一句说滴灰常好。
[解决办法]
用谎言去验证谎言,得到的一定是谎言
[解决办法]
引用:
C/C++ code

      #include<stdio.h>
      #include <stdlib.h>
      #include<string.h>
      int main()
      {
         char *str=NULL;
     char *p = NULL;
         str=calloc(10,sizeof(char));
   ……

++1
[解决办法]
错误的代码就没可能找出依据来证明合理性
[解决办法]
free 并未overwrite 内存内容,只是切断了指针变量和指向内存之间的联系
[解决办法]
假如你把你的QQ号卖给别人用了,后来你又偷偷登录上去用……
------解决方案--------------------


free之后指向该该内存的指针变成野指针,指向的内存位置是不确定的,因此再次使用时会出错,所以free之后,应将该指针指向NULL。即free(str); str = NULL; 目的是free之后的指针不可以再次使用,当我们再次使用时,就会马上报错。这样就不难解释在free之前将该指针赋值给另一个指针后,另一个指针可以正常打印数据了吧。

热点排行