70,020
社区成员




#include <stdio.h>
#include <stdlib.h>
//用free()释放内存后,结构体中"b"的值为什么还会保留?free()不是一次释放连续的内存空间吗?如果说free()后是将此块内存标记为可用,在上的数据依然存在,只是下次malloc()时后覆盖上新的数据,那为什么存放单个数据时,free()后此数据的值会为0?
main(){
typedef struct{
int a;
int b;
}stru;
void *memory_p=malloc(sizeof(int)*2);
stru *stru_p=(stru *)memory_p; //这里我的理解是将stru_p指向的结构放到由malloc()申请的内存上, 也就是说在这块内存上实例化此结构体
stru_p->a=10; //这里我理解的是stru_p->放在了由malloc()申请的内存上
stru_p->b=20;
free(memory_p);
printf("%d\n",*(int *)memory_p); //用free()释放memory_p指向的内存后,这里输出是0;
printf("%d\n",*(int *)(memory_p+4));/*用free()释放memory_p指向的内存后,再用memory_p访问结构体中的“b”。
输出为什么还是20?
*/
printf("%d\n",stru_p->a); //这里输出是0
printf("%d\n",stru_p->b); //这里和用(memory_p+4)进行访问的结果一样,输出的也是20.
/*------------------------------------------*/
//在申请的内存上存放连续的单个char型数时就不会有像存放结构体一样的问题
void *p=malloc(sizeof(char)*4);
char *char_p=(char *)p;
int i;
for(i=0;i<4;i++){
char temp=97;
char_p[i]=(temp+i);
}
free(p);
printf("%d\n",*(char *)(p+1)); //用free()释放p指向的内在时,这里输出是0
for(i=0;i<4;i++){
printf("%d ",*(char_p+i)); //这里循环输出4个0
}
}
free(p)只释放 p当前所指的内存块!//p=NULL 再把它指象NULL,防止悬垂指针
要想把b也释放再free(p+1)就行!// p+1=NULL 再把它指象NULL,防止悬垂指针
//至于下一个里数组为什么只释放一个P就所有都地址置零;偶也搞不清楚什么原因!
while(p){
free(p);
p = p->next;
}