为啥free(a)之后该地址还可用

C语言 码拜 7年前 (2017-05-08) 1829次浏览
本人看到一个教程里提到了这么一段:
free函数,释放动态内存
void *free(void *p)
举例:
char *a,*b
a = (char *) malloc(10*sizeof(char));
b = a;

free(a) /*释放其指向的动态内存*/
于是本人很好奇假如真是如此,那么释放a之后b会保存什么呢?所以本人写了如下的代码:

#include <stdlib.h>
#include <stdio.h>
int main()
{
    char *a,*b;
    a = (char *)malloc(10*sizeof(char));
    a = "hello";
    b = a;
    printf("a(%p):%s\nb(%p):%s\n",&a,a,&b,b);
    getchar();
    free(a);
    printf("aa:%p\n",&a);
    printf("a:%s\n",a);
    printf("ba:%p\n",&b);
    printf("b:%s\n",b);
    free(b);
    return 0;
}

结果让本人感到很尴尬……
为啥free(a)之后该地址还可用
按说假如b也指向了这块地址,那么a假如释放,b所指的内存应该也被释放了啊……
另外,为啥释放了之后a的地址还是存在?莫非是“内部消化”,不会直接显示?
那本人又该怎么样确定这块地址能否真的被释放了呢?
===========================
额外再问一个衍生的问题:
函数原型中,void * free(void *p)这里本人没看明白:
1、这个操作返回空,将返回空的函数作为指针函数有什么意义?
2、void *p是什么概念?不是已经void了么?将*p指为void怎么样符合之后写入的参数?……
3、void怎么样使用该参数?

解决方案

10

为啥租客把钥匙还给房东了,用其它钥匙还能进屋住?
malloc和free
相当于
借和还;
不相当于
创建和销毁。

10

其实电脑开机后物理内存的每个字节都是可读写的,从来不会原因是所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时能否能发现并能否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

20

地址还在, 房子不是你的了, 你住一晚试试。
另外,字符串指针赋值,没你这么干的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为啥free(a)之后该地址还可用
喜欢 (0)
[1034331897@qq.com]
分享 (0)