故意使用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使用的时候,心里更加有底。
故意使用free掉的内存的一个实验( 常量区/栈)的更多相关文章
- pop() 删除掉数组的最后一个元素
下面的代码首先创建了一个拥有四个元素的数组 myFish,然后删除掉它的最后一个元素. let myFish = ["angel", "clown", &quo ...
- 使用free掉的内存的危害
1 源码 #include <stdio.h> #include <stdlib.h> // 编译环境 gcc int main(void) { printf("** ...
- C++内存分配/分布——堆栈存储区
FROM: C++内存分配方式详解——堆.栈.自由存储区.全局/静态存储区和常量存储区 栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等 ...
- java中内存分配策略及堆和栈的比较
Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间 ...
- 内存分配方式,堆区,栈区,new/delete/malloc/free
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. [2]在栈上创建.在执行函数时 ...
- 转 C/C++内存分配方式与存储区
C/C++内存分配方式与存储区 C/C++内存分配有三种方式:[1]从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量.[2]在栈 ...
- 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷
2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产 ...
- 栈 堆 stack heap 堆内存 栈内存 内存分配中的堆和栈 掌握堆内存的权柄就是返回的指针 栈是面向线程的而堆是面向进程的。 new/delete and malloc/ free 指针与内存模型
小结: 1.栈内存 为什么快? Due to this nature, the process of storing and retrieving data from the stack is ver ...
- jvm内存模型(运行时数据区)
运行时数据区(runtime data area) jvm定义了几个运行时数据区,这些运行时数据区存储的数据,供开发者的应用或者jvm本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...
随机推荐
- Python爬虫 使用selenium处理动态网页
对于静态网页,使用requests等库可以很方便的得到它的网页源码,然后提取出想要的信息.但是对于动态网页,情况就要复杂很多,这种页面的源码往往只有一个框架,其内容都是由JavaScript渲染出来的 ...
- Vue.$set的使用场景
有这样一个需求,用户可以增加多个输入框可以编辑: 实现的思路很简单,点击增加的时候,往一个数组里面push一条数据即可: <template> <div> <di ...
- 攻防世界——Misc新手练习区解题总结<1>(1-4题)
第一题this_if_flag: 第一题就不多说了,题目上就给出了flag复制粘贴就可以了 第二题pdf: 下载附件后,得到如下界面 Ctrl+a全选文字,复制出来看看是什么,粘贴后恰好得到flag ...
- googleEarth
中国航天科技集团有限公司 http://www.spacechina.com/n25/n144/n210/index.html Celestia [官网]: https://celestia.spac ...
- 【原】通过Jenkin传值进Android代码
1) Jenkin中用-Pxxxx = yyyy来传值进gradle 2) 在AndroidManifest.xml中定义占位符: <meta-data android:name="X ...
- java初探(1)之登录总结
登录总结 前几章总结了登录各个步骤中遇到的问题,现在完成的做一个登录的案例,其难点不在于实现功能,而在于抽象各种功能模块,提高复用性,较低耦合度. 前端页面: 对于前端页面来说,不是后端程序员要考虑的 ...
- WebApi 接口传参接参
阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.后台发送请求参数的 ...
- String字符串的最大长度是多少?
在学习和开发过程中,我们经常会讨论 short ,int 和 long 这些基本数据类型的取值范围,但是对于 String 类型我们好像很少注意它的"取值范围".那么对于 Stri ...
- JVM调优和深入了解性能优化
JVM调优的本质: 并不是显著的提高系统性能,不是说你调了,性能就能提升几倍或者上十倍,JVM调优,主要调的是稳定.如果你的系统出现了频繁的垃圾回收,这个时候系统是不稳定的,所以需要我们来进行JVM调 ...
- 一些免费的API
Github 接口 Github 为我们提供了一些免费的 API 接口,利用这些接口我们可以开发一些工具. 接口文档地址为 https://docs.github.com/en/rest 下面是一个例 ...