• 故意使用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
    ",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使用的时候,心里更加有底。

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    WHENEVER SQLERROR EXIT AND DDL
    WHENEVER SQLERROR EXIT AND DML
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
    我的友情链接
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/11146340.html
Copyright © 2020-2023  润新知