故意使用free掉的内存的一个实验
考虑一下两种声明
struct stuff{ char home[10]; int num; char name[10]; }; struct stuff{ char *home; int num; char name[10]; };
// 第二种使用的是char*指针,*home的值储存在常量区
// 以第二种声明详细实验
#include <stdio.h> #include <stdlib.h> #include <string.h> struct stuff{ char *home; int num; char name[10]; }; int main(void){ struct stuff *Merry1 = NULL, *Merry2 = NULL; struct stuff *TOM=(struct stuff *)malloc(sizeof(struct stuff)); struct stuff *TOM_Bak =NULL; //这个备份本质是无效的 char * TOM_Valid_Bak =NULL; //有效备份 TOM->home="TOM_LONDON"; TOM->num=201; strcpy(TOM->name,"TOM"); printf("TOM->home=%s,addr=%p ,TOM->name=%s ",TOM->home,TOM->home,TOM->name); TOM_Bak = TOM; TOM_Valid_Bak = TOM->home; // 有效备份了TOM所使用的常量区的数据指针 free(TOM); //继续使用内存,让其他数据有机会使用之前TOM使用过的那些内存。 Merry1 = (struct stuff *)malloc(sizeof(struct stuff)); Merry1->home="Merry1_China"; strcpy(Merry1->name,"Merry1"); //继续使用内存,让其他数据有机会使用之前TOM使用过的那些内存。 Merry2 = (struct stuff *)malloc(sizeof(struct stuff)); Merry2->home="Merry2_China"; strcpy(Merry2->name,"Merry2"); printf("TOM->home=%s,addr=%p ,TOM->name=%s ",TOM->home,TOM->home,TOM->name); printf("TOM_Bak->home=%s,addr=%p ,TOM_Bak->name=%s ",TOM_Bak->home,TOM_Bak->home,TOM_Bak->name); // 这两句的打印结果是: //TOM->home=Merry1_China,addr=0x4007bd ,TOM->name=Merry1 //TOM_Bak->home=Merry1_China,addr=0x4007bd ,TOM_Bak->name=Merry1 //说明: 原先的TOM所使用的内存已经完全被Merry覆盖。 printf("TOM_Valid_Bak(home)=%s, addr=%p ", TOM_Valid_Bak, TOM_Valid_Bak); return 0; } root@ubuntu:~/C_Test# gcc free2.c root@ubuntu:~/C_Test# root@ubuntu:~/C_Test# root@ubuntu:~/C_Test# root@ubuntu:~/C_Test# root@ubuntu:~/C_Test# ./a.out TOM->home=TOM_LONDON,addr=0x4007b8 ,TOM->name=TOM TOM->home=Merry1_China,addr=0x4007ed ,TOM->name=Merry1 TOM_Bak->home=Merry1_China,addr=0x4007ed ,TOM_Bak->name=Merry1 TOM_Valid_Bak(home)=TOM_LONDON, addr=0x4007b8
小结:
搞清楚哪些存在栈上,哪些存在常量区,这样在结合malloc free使用的时候,心里更加有底。