使用指针时,调用malloc函数分配内存,使用完之后,调用free()函数释放内存.如以下程序:
#include<stdlib.h> #include<stdio.h> int main() { typedef struct { int a; char *str; }node,*l_node; l_node p = ( l_node)malloc(sizeof(p)); p -> a = 34; p -> str = "hello"; printf("a=%d str=%s\n",p->a,p->str); free(p); printf("free(p)之后:"); printf("a=%d str=%s\n",p->a,p->str); return 0; }
执行结果为:
a=34 str=hello
free(p)之后:a=0 str=hello
不清楚,内存已经释放了,为什么p依旧可以调用,而且整数a由原来的34变为0,而字符串却没有改变.
解决方案
5
释放的意义代表程序告诉系统,这块内存本人不用了,系统可以把这块内存分配给其它申请内存的语句.
至于什么时候分配.什么时候被其它的语句改掉,那就是未知的了.
而p这个指针自从创建以后它就是一个具体的指针变量.不使用时,请把它=NULL;以防误使用时得到不正确的结果.这就是野指针了.
至于什么时候分配.什么时候被其它的语句改掉,那就是未知的了.
而p这个指针自从创建以后它就是一个具体的指针变量.不使用时,请把它=NULL;以防误使用时得到不正确的结果.这就是野指针了.
1
《the c programming language》里说过memalloc是基于内存池机制的
1
内存中任何位置,只要不重写,原来的数据总是保存着
2
未定义行为。
free只是把内存还给了操作系统。
一般都不会清零(出于效率考虑)
free只是把内存还给了操作系统。
一般都不会清零(出于效率考虑)
5
原因是malloc释放内存是有先后问题的,虽然是结构体,但其包含的是不同的变量,分配给他们内存的时候有先后。而free释放的是最近一次调用的mallocfree的变量。而你这个问题出在,结构体内的char型,定义的是指针,系统不知道具体应该分配多少内存,所以字符串的内存并不是malloc分配的。所以释放的是int,释放后初始化为0;
1
l_node p = ( l_node)malloc(sizeof(*p));
2
释放内存不是清零内存,只是告诉说这块内存不要了,你可以再分配给“别人”
在未被覆盖之前,上面的值仍然在,但这是未定义行为,原因是这已经不是你的内存了,你也不知他什么时候会是什么
在未被覆盖之前,上面的值仍然在,但这是未定义行为,原因是这已经不是你的内存了,你也不知他什么时候会是什么
5
其实电脑开机后物理内存的每个字节都是可读写的,从来不会原因是所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时能否能发现并能否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。