4.缓冲区溢出攻击
C语言中的恶意攻击与防御技术解析

C语言中的恶意攻击与防御技术解析C语言作为一种强大而广泛应用的编程语言,不仅在软件开发领域发挥着重要作用,同时也成为黑客们实施恶意攻击的目标。
本文将对C语言中的恶意攻击进行解析,并探讨相应的防御技术。
1. 缓冲区溢出攻击缓冲区溢出攻击是最常见的C语言恶意攻击方式之一。
攻击者通过向程序输入超出缓冲区大小的数据,将恶意代码注入到原有代码中,进而控制程序的行为。
为了防止缓冲区溢出攻击,开发人员可以采取以下防御措施:- 使用安全的C标准库函数来替代不安全的函数,如使用“strncpy”替代“strcpy”。
- 对用户输入进行严格的输入验证和边界检查,确保输入的大小不会超过缓冲区的容量。
- 使用堆栈保护技术,如栈溢出保护(StackGuard)或堆溢出保护(HeapGuard)来防止攻击者篡改程序的返回地址。
2. 格式化字符串攻击格式化字符串攻击是另一种常见的C语言恶意攻击方式。
攻击者通过向格式化输出函数(如printf或sprintf)提供恶意格式字符串,可以读取程序内存的敏感数据、修改变量值甚至执行任意代码。
为了防止格式化字符串攻击,开发人员可以采取以下防御措施:- 检查和限制格式化字符串的输入,避免用户输入的变量被认为是格式化字符串。
- 使用类型安全版本的格式化输出函数,如“snprintf”来取代不安全的函数。
- 将敏感数据从栈上移除,使用局部变量等方式来隐藏敏感数据的地址。
3. 整数溢出攻击整数溢出攻击是指对程序中的整型变量进行恶意操作,使其值超出正常范围,从而影响程序的行为。
这种攻击方式常常发生在C语言中,因为C语言中的整数类型没有提供溢出检查机制。
为了防止整数溢出攻击,开发人员可以采取以下防御措施:- 对整型变量进行边界检查,确保其值不会超出预期范围。
- 使用无符号整数类型,因为无符号类型在溢出时会自动进行环绕,而不会导致未定义行为。
- 使用安全的整数操作函数,如“safe_add”、“safe_subtract”等,这些函数会在发生溢出时进行检查和处理。
缓冲区溢出攻击的基本原理

缓冲区溢出攻击的基本原理
缓冲区溢出攻击(Buffer Overflow Attack)是一种常见的安全漏洞,指的是攻击者利用输入数据的长度或格式错误,超出程序设计者预留的存储空间范围,从而写入到相邻内存空间中,进而控制程序的执行或修改程序的行为。
缓冲区溢出攻击的基本原理如下:
1.内存分配:程序在运行时会根据变量类型和长度来分配内存空间。
2.缓冲区溢出:攻击者通过向程序输入异常数据,超出了程序预留的内存空
间。
3.覆盖关键数据:溢出的数据覆盖了原本存储的数据,可能是程序的返回地
址、函数指针等关键信息。
4.控制程序行为:攻击者利用溢出的数据修改程序的执行路径,跳转到自己
准备好的恶意代码。
5.执行恶意代码:程序执行了攻击者注入的恶意代码,可能导致系统崩溃、
拒绝服务或远程执行任意命令。
为了避免缓冲区溢出攻击,开发人员可以采取以下措施:
•使用安全的编程语言和工具,如内存安全的语言(如Rust)或经过良好测试的C/C++库。
•限制输入数据的长度,确保不会超过缓冲区可容纳的大小。
•进行输入验证和过滤,确保输入数据符合预期的格式和范围。
•定期更新软件和操作系统,及时修补已知的漏洞。
•实施数据执行保护(DEP)和地址空间布局随机化(ASLR)等安全机制。
综上所述,缓冲区溢出攻击是一种常见的安全漏洞,它利用错误处理输入数据的程序中的缺陷,从而控制程序行为。
开发人员和系统管理员应该密切关注安全问题,采取相应的防护措施,以保护系统和用户的信息安全。
C语言中的缓冲区溢出攻击与防御

C语言中的缓冲区溢出攻击与防御缓冲区溢出是一种常见的计算机安全漏洞,特别是在C语言编写的程序中经常出现。
在C语言中,缓冲区指的是一块内存区域,用来存储字符串或其他数据。
当向缓冲区写入超过其容量限制的数据时,就会发生缓冲区溢出。
缓冲区溢出攻击是一种利用缓冲区溢出漏洞的攻击方式,攻击者会向缓冲区写入恶意代码,使得程序执行该恶意代码。
缓冲区溢出攻击可以导致程序崩溃、系统崩溃,甚至远程执行恶意代码,对计算机系统造成严重的安全威胁。
那么,如何进行缓冲区溢出攻击的防御呢?下面将介绍几种常用的防御措施。
1. 输入验证首先,要对用户的输入进行验证。
确保输入的数据不会导致缓冲区溢出。
可以使用安全的输入函数,如fgets()代替不安全的输入函数gets()。
另外,还可以限制用户输入的长度,确保不会超过缓冲区的容量。
2. 缓冲区溢出检测在编写程序时,可以加入缓冲区溢出检测的机制。
例如,使用一些工具或者编译选项来检测是否存在缓冲区溢出的漏洞。
在发现漏洞后,及时修复和更新程序,以提高系统的安全性。
3. 代码审计进行定期的代码审计是防御缓冲区溢出攻击的关键。
通过仔细检查程序中的代码,寻找潜在的漏洞和安全隐患。
同时,要时刻关注最新的安全补丁和漏洞信息,及时更新和修复程序中存在的安全问题。
4. ASLR技术地址空间布局随机化(ASLR)是一种常用的防御缓冲区溢出攻击的技术。
ASLR通过随机化程序的内存地址,使得攻击者难以确定恶意代码的准确位置。
这样一来,即使发生缓冲区溢出攻击,攻击者也很难利用该漏洞进行进一步的攻击。
5. 栈保护技术栈保护技术是一种防御缓冲区溢出攻击的有效手段。
常见的栈保护技术包括栈溢出检测、堆栈随机化和堆栈短路等。
这些技术可以有效地检测和阻止缓冲区溢出攻击,提高程序的安全性。
综上所述,缓冲区溢出攻击是一种常见的计算机安全漏洞,特别是在C语言编写的程序中容易发生。
为了防御缓冲区溢出攻击,我们可以进行输入验证、缓冲区溢出检测、代码审计等措施,同时借助ASLR 技术和栈保护技术来提高系统的安全性。
缓冲区溢出攻击课程设计

缓冲区溢出攻击课程设计一、课程目标知识目标:1. 学生能够理解缓冲区溢出攻击的基本概念,掌握其工作原理;2. 学生能够描述常见缓冲区溢出漏洞的类型及其影响;3. 学生能够解释防范缓冲区溢出攻击的策略和技术。
技能目标:1. 学生能够运用所学知识分析简单的缓冲区溢出漏洞;2. 学生能够运用相关工具检测并修复简单的缓冲区溢出漏洞;3. 学生能够编写简单的防止缓冲区溢出攻击的代码。
情感态度价值观目标:1. 学生培养对计算机安全的兴趣,增强网络安全意识;2. 学生树立正确的道德观念,遵循网络安全法律法规,不参与非法攻击行为;3. 学生培养合作精神,学会在团队中分享和交流网络安全知识。
课程性质:本课程属于计算机科学领域,针对高中年级学生,旨在让他们了解网络安全的基本概念,提高防范网络攻击的能力。
学生特点:高中年级学生对计算机有一定了解,具备基本的编程能力,但对网络安全知识相对陌生。
教学要求:结合学生特点,课程设计需注重理论与实践相结合,通过案例分析和实际操作,让学生掌握缓冲区溢出攻击的相关知识,提高网络安全技能。
同时,注重培养学生的道德观念和合作精神,使他们在学习过程中形成正确的价值观。
二、教学内容1. 缓冲区溢出攻击基本概念:介绍缓冲区溢出的定义、原理以及攻击者利用该漏洞的目的。
教材章节:第三章“计算机网络安全”第二节“缓冲区溢出攻击”2. 缓冲区溢出漏洞类型:分析常见缓冲区溢出漏洞,如栈溢出、堆溢出等,并举例说明。
教材章节:第三章“计算机网络安全”第二节“缓冲区溢出攻击”3. 防范缓冲区溢出攻击的策略和技术:讲解防范缓冲区溢出攻击的方法,如边界检查、使用安全编程语言等。
教材章节:第三章“计算机网络安全”第三节“防范网络攻击策略”4. 实践操作:结合相关工具,指导学生进行以下操作:a. 分析并检测简单的缓冲区溢出漏洞;b. 修复缓冲区溢出漏洞;c. 编写防止缓冲区溢出攻击的代码。
教材章节:第三章“计算机网络安全”第四节“实践操作”5. 案例分析:通过实际案例,让学生了解缓冲区溢出攻击对系统安全的影响,并分析案例中的漏洞和防范措施。
「网络安全」常见攻击篇(10)缓冲区溢出攻击

「网络安全」常见攻击篇(10)——缓冲区溢出攻击什么是缓冲区溢出攻击?▪缓冲区程序用来保存用户输入数据、程序临时数据的内存空间,本质为数组。
▪缓冲区溢出攻击攻击者利用程序漏洞,将自己的攻击代码植入有缓冲区溢出漏洞的程序执行体中,改变该程序的执行过程,来获取目标系统的控制权。
▪缓冲区溢出攻击原理程序员通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。
造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。
缓冲区溢出的攻击方式▪栈溢出(stack smashing)未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr, 当函数返回执行ret指令时,retaddr从栈中弹出,作为下一条指令的地址赋给%eip寄存器,继而改变原程序的执行流程指向我们的shellcode.▪堆溢出(malloc/free heapcorruption)一种是和传统的栈溢出一样, 当输入超出malloc()预先分配的空间大小,就会覆盖掉这段空间之后的一段存储区域,如果该存储区域有一个重要的变量比如euid,那么我就可以用它来攻击。
另一种是典型的double-free堆腐败,在内存回收操作中,合并相邻空闲块重新插入双向链表时会有一个写4字节内存的操作,如果弱点程序由于编程错误free()一个不存在的块,我们就可以精心伪造这个块,从而覆盖任何我们想要的值:函数的返回地址、库函数的.plt地址等▪格式化字符窜漏洞(format stringvulnerability)如果格式窜由用户定制,攻击者就可以任意伪造格式窜,利用*printf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用”%n”覆盖指针、返回地址等。
▪整形变量溢出(integer variableoverflow)利用整数的范围、符号等问题触发安全漏洞,大多数整形溢出不能直接利用,但如果该整形变量决定内存分配等操作,我们就有可能间接利用该漏洞。
缓冲区溢出攻击原理与防范

缓冲区溢出攻击原理与防范1.程序预留了一块内存区域作为缓冲区,用于执行其中一种特定的操作,如字符串拼接、输入输出处理等;2.当输入的数据长度超过了这个缓冲区的大小时,多余的数据会溢出到相邻的内存区域中;3.攻击者利用输入超出缓冲区的长度来对溢出的数据进行控制,修改程序的执行流程;4.修改后的程序执行流程可以导致程序崩溃、系统崩溃、拒绝服务等问题,也可以用于执行任意的恶意代码。
为了防范缓冲区溢出攻击,可以采取以下几种措施:1.对输入进行有效的长度检查:在程序中对输入数据进行有效的长度检查,确保不会超过预定的缓冲区大小。
这样就可以避免发生缓冲区溢出。
2. 使用安全编程语言和工具:选择使用安全编程语言,如Rust、Go 等,这些语言具有安全性的内存管理机制,能够自动检查和防范缓冲区溢出问题。
此外,使用安全编程工具如静态代码分析工具、Fuzzing工具等也可以帮助发现和修复潜在的缓冲区溢出漏洞。
3.使用内存安全检查工具:使用内存安全检查工具,如利用内存隔离技术的地址空间布局随机化(ASLR)、点火检查器、堆栈保护机制等。
这些工具可以帮助检测和防范缓冲区溢出攻击。
4.最小特权原则:在设计软件时,采用最小特权原则,即仅分配程序所需的最小权限。
这样做可以确保即使发生缓冲区溢出攻击,攻击者也只能访问到最小特权内的信息,减少损失。
5.及时修复漏洞和更新软件:及时修复已知的缓冲区溢出漏洞,更新软件以获取最新的安全补丁是非常重要的。
由于缓冲区溢出攻击是一种常见的攻击方式,软件开发商通常会不断更新修复这方面的漏洞。
综上所述,缓冲区溢出攻击是一种常见的安全漏洞利用技术,可以对各种软件和操作系统进行攻击。
为了防范这种攻击,需要采取有效的措施,如对输入进行有效的长度检查、使用安全编程语言和工具、使用内存安全检查工具、采用最小特权原则以及及时修复漏洞和更新软件等。
这样可以有效地减少缓冲区溢出攻击带来的风险。
缓冲区溢出攻击与防范实验报告

缓冲区溢出攻击与防范实验报告——计算机网络(2)班——V200748045黄香娥1·缓冲区溢出的概念:缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间想匹配,这就为缓冲区溢出埋下隐患.操作系统所使用的缓冲区又被称为"堆栈". 在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。
2·缓冲区溢出的危害:在当前网络与分布式系统安全中,被广泛利用的50%以上都是缓冲区溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕虫。
而缓冲区溢出中,最为危险的是堆栈溢出,因为入侵者可以利用堆栈溢出,在函数返回时改变返回程序的地址,让其跳转到任意地址,带来的危害一种是程序崩溃导致拒绝服务,另外一种就是跳转并且执行一段恶意代码,比如得到shell,然后为所欲为。
3·缓冲区溢出原理:由一个小程序来看://test.c#include "stdio.h"#include "stdlib.h"#include "string.h"void overflow(void){char buf[10];strcpy(buf,"0123456789123456789");}//end overflowint main(void){overflow();return 0;}//end main按F11进入"Step into"调试模式,如下:按F11跟踪进入overflow,让程序停在6,现在再看一下几个主要参数:esp=0x0012ff30,eip发生了变化,其它未变。
4.1 缓冲区溢出攻击

题目:缓冲区溢出攻击日期:2014年12月4日实验目的:1.了解缓冲区溢出攻击的现象;2.掌握使用缓冲区溢出攻击工具的方法。
实验过程:1.利用ms06035漏洞进行攻击1.进入“ms06035漏洞利用工具”目录2.查看当前目录内容3.主机A执行“ms06035.exe 主机B的ip 445”命令,发起对主机B的攻击。
4.主机B观察被攻击现象主机B被攻击后出现蓝屏死机的现象2.利用ms08025漏洞进行攻击1.telnet登录系统(1)Telnet登录同组主机(2)主机A依次输入“d:”|“dir”查看同组主机D盘根目录,“ms08025.exe”即为实验工具。
2.使用系统命令添加用户主机A使用“net user student1 /add”命令来试添加一个用户“student1”,执行该命令,出现“发生系统错误5,拒绝访问”的提示。
3.查看ms08025工具使用方法主机A在telnet命令行中输入“ms08025.exe”,查看工具的使用方法4.使用ms08025工具添加用户主机A执行“ms08025.exe "net user student1 /add"”命令,提示命令成功完成,证明用户student1成功添加5.查看用户信息主机A用命令“net user student1”查看用户student1的信息,发现用户student1创建成功,隶属于Users组6.用ms08025工具对新建账户提权主机A使用命令“net user student1”查看用户student1信息,可发现用户student1已被提升到管理员权限3.ms06035,ms08025漏洞攻击的防御方法1.ms06035漏洞攻击的防御方法:(1)停止server服务;(2)安装ms06063漏洞补丁。
2.ms08025漏洞攻击的防御方法:安装ms08025漏洞补丁。
答:做出防御策略后,攻击不成功。
实验结果及总结:1.利用ms06035对目标主机进行攻击,目标主机会出现蓝屏现象;利用ms08025进行攻击,可以在目标主机上新建用户并授予管理员权限;2.防御这两种漏洞,有两种方法,一则关闭相关服务,二则为打上相应补丁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当前ESP 语句执行前的ESP
语句执行前的EBP
24
函数调用中栈的工作过程
AFunc(5,6);
…… call _AFunc add esp+8
当前ESP EDI ESI EBX
_AFunc {……return 0;}
pop edi pop esi pop ebx add esp,48h //栈校验 pop ebp ret
引子
1988 Morris蠕虫事件 CERT统计数据
4.1 缓冲区溢出相关概念
缓冲区
从程序的角度,缓冲区就是应用程序用来保存用户 输入数据、程序临时数据的内存空间 缓冲区的本质 数组 存储位置 Stack Heap 数据段
4.1 缓冲区溢出相关概念
缓冲区溢出
简单溢出实例
void func1(char *input) { char buffer[16]; strcpy(buffer,input); }
上面的strcpy()将直接把input中的内容复制到buffer 中。这样只要input的长度大于16,就会造成buffer 的溢出,使程序运行出错。 存在像strcpy这样问题的标准函数还有strcat(), sprintf(),vsprintf(),gets(),scanf()以及在循环内 的getc(),fgetc(),getchar()等。
补充:PEB&TEB
TEB(Thread Environment Block,线程环境块) 系统在此TEB中保存频繁使用的线程相关的数据。 位于用户地址空间,在比 PEB 所在地址低的地方。 进程中的每个线程都有自己的一个TEB。一个进 程的所有TEB都以堆栈的方式,存放在从 0x7FFDE000开始的线性内存中,每4KB为一个完 整的TEB,不过该内存区域是向下扩展的。
23
函数调用中栈的工作过程
main() AFunc(5,6);
push 6 push 5 call _AFunc add esp+8
当前EBP _AFunc EDI ESI EBX
48h 4(n=4) 3(m=3) EBP EIP 5 6
push ebp mov ebp,esp sub esp,48h //压入环境变量 //为局部变量分配空间
调用函数后
恢复EBP 恢复EIP 局部变量不作处理
例子
int main() {AFunc(5,6); return 0;}
int AFunc(int i,int j) { int m = 3; int n = 4; m = i; n = j; BFunc(m,n); return 8; } int BFunc(int i,int j) { int m = 1; int n = 2; m = i; n = j; return m; }
4.3 缓冲区溢出原理及其利用
缓冲区溢出种类
栈溢出 堆溢出 整型溢出 格式化字符串溢出 其他溢出
栈溢出
特点
缓冲区在栈中分配 拷贝的数据过长 覆盖了函数的返回地址或其它一些重要数据结构、 函数指针
栈溢出实例
int AFunc(int i,int j) 用BFunc的地址替换正常 { 的AFunc返回地址,使程 int m = 3; 序运行至BFunc int n = 4; char szBuf[8] = {0}; *(int *)((int)szBuf+20) = BFunc; m = i; n = j; BFunc(m,n); return 8; }
三个重要的寄存器
SP(ESP)
即栈顶指针,随着数据入栈出栈而发生变化
BP(EBP)
即基地址指针,用于标识栈中一个相对稳定的位置。 通过BP,可以方便地引用函数参数以及局部变量
IP(EIP)
即指令寄存器,在将某个函数的栈帧压入栈中时, 其中就包含当前的IP值,即函数调用返回后下一个 执行语句的地址
网络与系统攻击技术
第四章 缓冲区溢出攻击
本章内容
4.1 缓冲区溢出相关概念 4.2 缓冲区溢出原理 4.3 溢出保护技术 4.4 安全编程技术
本章要求
了解缓冲区溢出的相关概念 明确缓冲区溢出的危害 理解栈溢出、堆溢出、整型溢出、格式化字符串 溢出及文件流溢出的原因 掌握安全编程技术
示例
int a = 0; //全局初始化区 char *p1; //全局未初始化区 void main() { int b; //栈 //栈 char s[] = "abc"; char *p2; //栈 char *p3 = "123456"; //123456{post.content}在常量区,p3在栈上 static int c = 0; //全局(静态)初始化区 p1 = (char *)malloc(10); //分配得来得10字节的区域在堆区 p2 = (char *)malloc(20); //分配得来得20字节的区域在堆区 strcpy(p1, "123456"); }
缓冲区溢出的危害
应用程序异常 系统不稳定甚至崩溃
程序跳转到恶意代码,控制权被窃
4.2 缓冲区溢出原理
预备知识
理解程序内存空间 理解堆栈 理解函数调用过程 理解缓冲区溢出的原理
Windows环境下的堆栈
程序空间由何构成? 堆栈是什么? 堆栈里面放的都是什么信息? 程序使用超过了堆栈默认的大小怎么办? 在一次函数调用中,堆栈是如何工作的?
PEB(Process Environment Block,进程环境块) 存放进程信息,每个进程都有自己的PEB信息。 位于用户地址空间。 在Win 2000下,进程环境块的地址对于每个进程 来说是固定的,在0x7FFDF000处,这是用户地 址空间,所以程序能够直接访问。在用户态下 WinDbg中可用命令$proc取得PEB地址。
当前EBP
48h 4(n=4) 3(m=3) EBP EIP 5 6
语句执行前的ESP
语句执行前的EBP
25
栈的操作 Intel x86上的栈被认为是反向的,即意味着栈 向下增长。当一个信息被压入栈,ESP减少,新 元素被写入目标地址。当一个信息被弹出时,则 从ESP指针所指向的地址中读出一个元素,ESP 增加,移向上边的边界并压缩栈。这样,当说一 个元素被放置在栈的顶端时,它实际上被写在所 有先进入栈元素的下面。
函数调用过程
把参数压入栈 保存指令寄存器中的内容,作为返回地址 放入堆栈当前的基址寄存器 把当前的栈指针(ESP)拷贝到基址寄存器,作为新 的基地址 为本地变量留出一定空间,把ESP减去适当的数 值
函数调用中栈的工作过程
调用函数前
压入栈
上级函数传给A函数的参数 返回地址(EIP) 当前的EBP 函数的局部变量
如果用户输入的数据长度超出了程序为其分配的内 存空间,这些数据就会覆盖程序为其它数据分配的 内存空间,形成所谓的缓冲区溢出
人为的溢出则是有一定企图的,攻击者编写一个 超过缓冲区长度的字符串,植入到缓冲区,这时 可能会出现两个结果:
一是过长的字符串覆盖了相邻的存储单元,引起程 序运行失败,严重的可导致系统崩溃; 另一个结果就是利用这种漏洞可以执行任意指令, 甚至可以取得系统root特级权限。
栈
栈是一块连续的内存空间
先入后出 生长方向与内存的生长方向正好相反, 从高地址向 低地址生长
每一个线程有自己的栈
提供一个暂时存放数据的区域
使用POP/PUSH指令来对栈进行操作 使用ESP寄存器指向栈顶,EBP指向栈帧底
栈内容
函数的参数 函数返回地址 EBP的值 一些通用寄存器(EDI,ESI…)的值 当前正在执行的函数的局部变量
C语言中内存分配
在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分配得到的就是 在堆上。 在所有函数体外定义的是全局量,加了static修饰 符后不管在哪里都存放在全局区(静态区),在所 有函数体外定义的static变量表示在该文件中有效, 不能extern到别的文件用,在函数体内定义的 static表示只在该函数体内有效。 另外,函数中的"adgfdf"这样的字符串存放在常量 区。
C语言中内存分配
在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放, 程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存 储是放在一块的,初始化的全局变量和静态变量 在一块区域,未初始化的全局变量和未初始化的 静态变量在相邻的另一块区域。- 程序结束释放 4.另外还有一个专门放常量的地方。- 程序结束释 放
//123456{post.content}放在常量区,编译器可能会 将它与p3所指向的"123456"优化成一块
C++中内存分配
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静 态存储区和常量存储区。 1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清 除的变量的存储区。里面的变量通常是局部变量、函数参数等。 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我 们的应用程序去控制,一般一个new对应一个delete。如果程序员 没有释放掉,那么在程序结束后,操作系统会自动回收。 3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相 似的,不过它是用free来结束自己的生命的。 4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在 以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里 面没有这个区分了,他们共同占用同一块内存区。 5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量, 不允许修改(当然,你要通过非正当手段也可以修改)