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

故意使用free掉的内存的一个实验( 常量区/栈)的更多相关文章

  1. pop() 删除掉数组的最后一个元素

    下面的代码首先创建了一个拥有四个元素的数组 myFish,然后删除掉它的最后一个元素. let myFish = ["angel", "clown", &quo ...

  2. 使用free掉的内存的危害

    1 源码 #include <stdio.h> #include <stdlib.h> // 编译环境 gcc int main(void) { printf("** ...

  3. C++内存分配/分布——堆栈存储区

    FROM: C++内存分配方式详解——堆.栈.自由存储区.全局/静态存储区和常量存储区 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等 ...

  4. java中内存分配策略及堆和栈的比较

    Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...

  5. 内存分配方式,堆区,栈区,new/delete/malloc/free

    1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...

  6. 转 C/C++内存分配方式与存储区

    C/C++内存分配方式与存储区 C/C++内存分配有三种方式:[1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量.[2]在栈 ...

  7. 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷

    2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产 ...

  8. 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型

    小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...

  9. jvm内存模型(运行时数据区)

    运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...

随机推荐

  1. GA教程:使用自定义变量来扩展高级细分

    http://www.wocaoseo.com/thread-64-1-1.html 您可以使用自定义变量来扩展高级细分的范围. 高级细分依据的标准是用户的会话(访问)数据.如果某个访问者在指定日期范 ...

  2. MySQL 字符类型

    字符类型 MySQL提供了多种关于字符存储的类型,但是在大多数情况下我们只使用char和varchar即可 类型 大小 用途 CHAR 0-255字节 定长字符串 VARCHAR 0-65535 字节 ...

  3. 软件人如何快速晋升CTO(一)

    1.场景描述 ​ 软件人如何快速晋升CTO? 实战操作,介绍下如何0成本拥有自己的软件公司,出任CTO/CEO. ​ 2020年 8月16日,软件老王拿到公司的营业执照和公章了,税务登记也一起办理好了 ...

  4. [PyTorch 学习笔记] 3.3 池化层、线性层和激活函数层

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson3/nn_layers_others.py 这篇文章主要介绍 ...

  5. 阿里Java中级开发测试相关试题及答案

    ------------恢复内容开始------------ 1.JSP文件上传的HTML标签代码定义是? A. <input type="text" name=" ...

  6. 构造清华大学的yum源

    [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# vim qinghua.repo [qinghua] na ...

  7. Mysql性能参数优化

    1.Max_connections (1)简介 Mysql的最大连接数,如果服务器的并发请求量比较大,可以调高这个值,当然这是要建立在机器能够支撑的情况下,因为如果连接数越来越多,mysql会为每个连 ...

  8. unity中使用的着色器语言

    在unity中,着色器编程使用了一列列的HLSL语言变种(也叫作Cg,但是大部分实际上两者都是一样的). 目前,为了在不同平台下保持最好的跨平台性, 取样贴图时,最好使用DX9风格 的HLSL. 着色 ...

  9. 推荐一个IT老鸟肝了2月有余的免费开源WPF企业级开发框架

    一个新学WPF的IT老鸟,肝了2个月做了这么一个WPF企业级开发框架,站长clone学习,觉得甚是不错.这是一个使用了Prism搭建的插件式框架,封装了DataGrid的使用,使整个框架子模块简单易学 ...

  10. SpringBean容器启动流程+Bean的生命周期【附源码】

    如果对SpringIoc与Aop的源码感兴趣,可以访问参考:https://javadoop.com/,十分详细. 目录 Spring容器的启动全流程 Spring容器关闭流程 Bean 的生命周期 ...