故意使用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本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...
随机推荐
- 谷歌分析(GA)新版的有哪些改变
http://www.wocaoseo.com/thread-221-1-1.html 最近GA做了两次大规模改版,修改了GA使用率最高的traffic source.content面板以及最核心的a ...
- 元素的生于死(python里元素获取与删除)
今天被个元素烦着了,找了下网上也没啥直接详细的方法 就总结了下今天找过的方法,分享些简单的方法 直接放干货 删除篇 要删除列表元素的首次出现,只需要list.remove >>> a ...
- codeblocks显示:不支持的16位应用程序 解决办法
我是win10 64位系统,写c++运行就会显示不兼容16位应用程序.以前编出来的exe还能用,今天编出的就炸了. 试了用vs编译.vs能用. 试了网上找的各种解决方案, 360修复, 注册表, 重构 ...
- python爬虫--看看虎牙女主播中谁颜值最高
目录 爬虫 百度人脸识别接口 效果演示 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知 ...
- Android-PullToRefresh上拉下拉刷新加载更多,以及gridview刷新功能的Library下载地址
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985,转载请说明出处. 首先大家应该都听说过此开源框架的强大之处,支持单列以及双列的 上拉加载以及下拉刷新功 ...
- centos7 RPM MySQL5.5
一.安装MYSQL 把下载好的rpm版的mysql上传到centos7中,目前公司中最爱用的是5.5版本和5.7版本,推荐用5.5. 先安装服务端 rpm -ivh MySQL-server-5.5. ...
- node中间件
npm i body-parser post 请求主题中间件 const bodyParser = require('body-parser') const bodyParser = requir ...
- Zookeeper源码解读
1.1. 客户端源码 1.1.1. 总体流程 启动客户端 zkCli.sh文件里面的配置 实际运行 public static void main(String args[]) throws Keep ...
- Java 得到指定时间加半个小时之后得时间
Calendar c = Calendar.getInstance(); c.setTime(cur); //设置时间 c.add(Calendar.MINUTE, 1); //日期分钟加1,Cale ...
- 7.SwrContext音频重采样使用
头文件位于#include <libswresample/swresample.h> SwrContext常用函数如下所示 SwrContext *swr_alloc(void); / ...