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 函数实现时,可能会在内存中写入释放标记
用谎言去验证谎言,得到的一定是谎言
[解决办法]
大才!最后一句说滴灰常好。
[解决办法]
用谎言去验证谎言,得到的一定是谎言
[解决办法]
++1
[解决办法]
错误的代码就没可能找出依据来证明合理性
[解决办法]
free 并未overwrite 内存内容,只是切断了指针变量和指向内存之间的联系
[解决办法]
假如你把你的QQ号卖给别人用了,后来你又偷偷登录上去用……
------解决方案--------------------
free之后指向该该内存的指针变成野指针,指向的内存位置是不确定的,因此再次使用时会出错,所以free之后,应将该指针指向NULL。即free(str); str = NULL; 目的是free之后的指针不可以再次使用,当我们再次使用时,就会马上报错。这样就不难解释在free之前将该指针赋值给另一个指针后,另一个指针可以正常打印数据了吧。