我理解的malloc()和free()。
关于malloc和free这两个函数,malloc的使用方法演示样例:int *p=(int *)malloc(2*sizeof(int)); 它表示在堆中开辟一块大小为2*sizeof(int)的一块内存空间,p指向这块内存空间的起始地址。malloc前面的(int*)表示这块空间用来存储int型数组。开辟了这块空间后。能够改动这个空间中的值。比如为*p,*(p+1)做赋值操作,假设再次使用malloc函数,比如再写一个 int *q=(int *)malloc(2*sizeof(int)); 此时开辟的以q为起始地址长度为2*sizeof(int)的空间是不会覆盖p所指向的空间的。
可是。假设在int
*q=(int *)malloc(2*sizeof(int));之前写一个free(p),那么,q所指向的空间则有可能覆盖p指向的空间。所谓的free(p)操作,事实上是改动p所指向的空间的标记值。让其能够被覆盖。
虽然运行了free(p),p仍就指向曾经的起始地址,依然能够对*p,*(p+1)赋值,而且可訪问他们(比如输出)。
代码例如以下:
int main(){
int *p=(int *)malloc(2*sizeof(int));
free(p);
*p=1;
*(p+1)=2;
cout<<p<<endl<<(p+1);
cout<<endl;
cout<<*p<<endl<<*(p+1); int *q=(int *)malloc(2*sizeof(int));
cout<<endl<<q<<endl<<(q+1);
cout<<endl<<*q<<endl<<*(q+1);
return 1;
}
执行结果:
补充:
int *p=(int *)malloc(2*sizeof(int)); 若要释放这段空间,必须free(p),仅仅是单单想释放部分空间,比如free(p+1)是不同意的。
如有错误,请大家指正。
我理解的malloc()和free()。的更多相关文章
- 理解 glibc malloc:主流用户态内存分配器实现原理
https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ...
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...
- 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57e3a3bc42eb88da6d4be143 作者:王赛 1. 前言 Andr ...
- Linux堆溢出漏洞利用之unlink
Linux堆溢出漏洞利用之unlink 作者:走位@阿里聚安全 0 前言 之前我们深入了解了glibc malloc的运行机制(文章链接请看文末▼),下面就让我们开始真正的堆溢出漏洞利用学习吧.说实话 ...
- Linux堆内存管理深入分析(上)
Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞 ...
- AndroidLinker与SO加壳技术之上篇
1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...
- C语言--指针问题_1
#include <stdio.h> #include <string.h> main() { int *a,*b,*c; a=b=c=(int *)malloc(sizeof ...
- Linux堆内存管理深入分析
(上半部) 作者:走位@阿里聚安全 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较 ...
- Linux堆内存管理深入分析 (上半部)【转】
转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析(上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越来 ...
随机推荐
- centos6.7系统安装流程
虚拟机创建centos的过程,如下: 1.首先创建一个空白文件 2.打开虚拟机,打开文件,或者页面的<创建虚拟机>,如下: 3.打开之后如下所示,选择自定义,Linux崇尚自由 4.第四步 ...
- transition过度
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 基于IWICImage的截图代码
截图方式和以前一样, 用GetDC, 保存为JPG的方式改用IWICImage接口, 在我机器上 1920*1080 大概花费70毫秒左右, 比用TJPEGImage快了一倍多(TJPEGImage需 ...
- EF错误
The model backing the 'XXXXDBContext' context has changed since the database was created. Either man ...
- web前端-----jQuery
web前端之jQuery篇 一 jQuery是什么? [1] jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. [2] j ...
- SpringAware
哈哈,终于把分布式的课程演讲给混过去了,下面开始随便自己学点东西. 正题:SpringAware--------在实际项目中,用到spring容器的本省功能资源,这是Bean必须意识到Spring容器 ...
- python 按每行读取文件怎么去掉换行符
python按每行读取文件后,会在每行末尾带上换行符,这样非常不方便后续业务处理逻辑,需要去掉每行的换行符,怎么去掉呢?看下面的案例: >>> a = "hello wor ...
- TensorFlow学习笔记(一):数据操作指南
扩充 TensorFlow tf.tile 对数据进行扩充操作 import tensorflow as tf temp = tf.tile([1,2,3],[2]) temp2 = tf.tile( ...
- c++用指针交换数组
对于指针一直很迷,今天看了一下指针交换数组,知识量很少,希望能帮助到大家. 利用指针来交换数组主要是为了节省时间嘛,有两种交换方式 第一种是写一个函数把数组传过去然后用swap交换,即可 代码如下: ...
- 大雄和哆啦A梦
题目:大雄和哆啦A梦题目介绍:这个图片名称有点奇怪?! 1,打开链接会看到大雄和哆啦A梦的照片,把它下载下来.就是下面这个图片. 2,用wireshark打开,会看到最后面出现 rar ,还有flag ...