博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
变量在内存中的存储
阅读量:2385 次
发布时间:2019-05-10

本文共 1928 字,大约阅读时间需要 6 分钟。

C++中变量在内存中的存储
一、内存大致可以分为三部分:代码区、堆栈区、静态数据段。C和C++中有全局变量,静态变量以及局部变量等几类。全局变量和静态变量是在编译的时候就已经分配好在数据段,也就是说在执行main函数之前就已经分配好了地址,如果定义的时候已经初始化,那么就存放初始化的值,如果没有初始化,则由编译器初始化为0。这就说明在整个程序的执行过程中全局变量和静态变量的地址和类型不会发生变化,可能变化的只是他的值。对于动态变量,则在编译的阶段并不分配内存,而是执行到相应的代码段时再分配内存。局部变量共有以下几种:
1 int main(void)  {    int a;//局部变量定义于main中    ...........    {    int a;//局部变量定义于代码段内    }  }2 void fun()  {    int a;//局部变量定义于普通函数内    ...  }3 void fun(int a,int b)//形式参数  {   ...  }
编译器对局部变量的处理是放入栈中,出栈和入栈操作的操作数都是跟着指令存在于代码段内的,当函数执行到局部变量处,进行入栈操作,给他分配栈中的内存,供其它操作访问。在使用结束后再出栈。所以,局部变量的生存期是从定义的地方到该函数结束和代码段结束。
二、在C++中,内存管理是一件十分让人畏惧的事,要考虑的方面和情况很多,我认为关键的一点是要知道你的这个内存是属于什么分区中。在C++中程序在运行过程中分为:栈,堆,常量数据区,自由存储区,全局/静态存储区,这些区的管理还是有些区别的。
    在栈中分配的变量主要是:参数,函数内定义的局部变量,由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。
    堆:主要是用new操作符来定义的申请的内存空间,不是在编译器来管理分配,而是有程序自身来管理申请与销毁。通常是用delete来删除释放内存空间。
    常量数据区:存放程序定义的一些常量。常量在理论上是不让改变的。
    自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
    全局/静态存储区:存放全局变量及定义的静态变量。
    示例:
#include
using namespace std;char * getValues(){ char ach[]="7guiopkl"; return ach;}char * getValues_2(){ char *ach="qwert"; return ach;}char * getValues_3(){ static char *ach="ihnmbv"; return ach;}char * getValues_4(){ char *ach=new char[7]; memset((void*)ach,0,7); memcpy((void *)ach,"asdfgh",7); return ach;}int main(){ cout<<"测试栈变量"<
结果为:
测试栈变量
*rc =7 rc values =7guiopkl
测试常量
*rc2 = q rc2 values =qwert
修改常量数据区中的值
*rc2 = 1 rc2 values =1234
测试局部静态变量
*rc3 = i rc3 values =ihnmbv
修改静态局部变量
*rc3 = q rc3 values =qaws
测试局部堆变量
*rc4 = a rc4 values =asdfgh
请按任意键继续. . .
(1)变量ach定义在局部函数中,所以是局部变量。局部变量存储在栈中,即在栈中开辟一块内存(首地址为ach)用来存放字符串。当局部函数被调用时,局部变量ach入栈,当局部函数结束时出栈,该块内存被释放。函数返回该块栈内存的首地址,由于该地址和新的变量rc绑定,所以返回的地址只指向字符串的第一个字符,后面的内存都释放掉了。所以*rc是'7',rc是乱码了。
(2)在局部函数getValues_2()中,ach是一个局部指针变量,即在栈内存中开辟一个大小为4byte的空间存放指针,字符串"qwert"存放在常量数据区,函数返回栈中存放的地址,这个地址指向常量数据区的中的数据,因此可以解引用。
(3)ach是一个静态指针,它在main之前就分配好了内存(全局/静态存储区),static的值是可以改变的。
(4)ach是存放在栈中的指针,它指向对内存中的一块区域。

转载地址:http://janab.baihongyu.com/

你可能感兴趣的文章
how to use this bugs unserialize()
查看>>
PHP中GPC绕过的一些总结
查看>>
highlight_file函数漏洞
查看>>
php escapeshellcmd多字节编码漏洞解析及延伸
查看>>
PHP5 Globals Vulnerability
查看>>
关于php包含Apache日志的随想
查看>>
Grep与web漏洞挖掘
查看>>
正则表达式使用详解
查看>>
引用函数magic_quotes_gpc和magic_quotes_runtime的区别和用法(新手推荐)
查看>>
编写不受魔术引号影响的php应用
查看>>
PHP开发安全设置
查看>>
Php Endangers - Remote Code Execution
查看>>
变量的变量,PHP和你
查看>>
PROC系列之四---/proc/loadavg
查看>>
Linux下修改系统IP
查看>>
Crack Oracle Password
查看>>
mysql学习笔记
查看>>
常用的oracle命令
查看>>
邪恶的strip_tags()函数
查看>>
ART OF WEB-SQL-INJECTION第2卷 ORACLE篇
查看>>