故意使用free掉的内存的一个实验( 常量区/栈)

故意使用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\n",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\n",TOM->home,TOM->home,TOM->name);    
printf("TOM_Bak->home=%s,addr=%p ,TOM_Bak->name=%s\n",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 \n", 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使用的时候,心里更加有底。

猜你喜欢

转载自www.cnblogs.com/happybirthdaytoyou/p/11146340.html