故意使用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本身使用.按线程共享与否可以分为线程间共享和线程间独立. 线程间独 ...
随机推荐
- 为何要做seo关键词排名
http://www.wocaoseo.com/thread-229-1-1.html 武汉seo百度指数在150左右,做seo的同仁们都知道这样的一件事情. 真正搜索武汉seo关键词能作为潜在客户的 ...
- Mybatis实例增删改查(二)
创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...
- Java8 日期和时间类
新的日期和时间API 新的日期和时间类解决了Date和Calendar类出现的问题 浅尝 LocalDate 日期类 LocalDate of = LocalDate.of(2018, 7, 13); ...
- Leetcode 全排列专题(更新ing)
总览 涉及到的题目有 题号 名字 难度 Leetcode 60 第k个排列 中等 Leetcode 46 全排列 中等 待更新...... Leetcode 46 全排列 题目 基础题 给定一个 没有 ...
- centos开放指定端口
1.开启防火墙 systemctl start firewalld 2.开放指定端口 firewall-cmd --zone=public --add-port=1935/tcp ...
- 局域网内笔记本分屏到android手机上
前提 笔记本电脑1台 安卓/ios手机1部 局域网 spacedesk 预览 参考: https://www.appinn.com/spacedesk https://spacedesk.net/de ...
- “未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决方案
不论是连接Access数据库或是SQL Server数据库,"未在本地计算机上注册"Microsoft.ACE.OLEDB.12.0"提供程序."这个问题从Of ...
- IT行业程序开发如何
学习程序开发怎么样,由于软件开发涉及到的知识结构比较丰富,所以学习软件开发通常需要一个系统的学习过程.如果未来要想专业从事软件开发工作,那么可以按照以下步骤学习软件开发技术: 第一:从计算机操作系统开 ...
- day09记录
今日内容大纲 毒鸡汤课 坚持.努力! 生成器 yield yeild return yeild from 生成器表达式 内置函数I 昨日内容回顾作业讲解 可迭代对象 可以更新得带的 实实在在的值. 内 ...
- [leetCode]5. 最长回文子串(DP)
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 题解 dp.先初始化长度为1和长度为2的串.再依次算长度为3,4,5.... 当找到回文串时,若长度比当 ...