一、内存图
-
任何一个程序不是说在硬盘中就可以被CPU执行的,而是需要放到内存中,那么一个程序在使用内存时往往会被分为如下的几个区域
-
代码区:写的代码(语句、函数等)所存放的区域,包括汇编指令;这块区域里的数据是可读可写的
-
堆栈:参数、局部变量、临时数据所存放的区域
-
堆:动态申请的,且大小可变的数据所存放的区域,比如链表等;可读可写
-
全局变量区:定义的全局变量所存放的区域;可读可写
-
常量区:常量所在区域;只读!

二、全局和局部变量
1.全局变量
-
定义在函数外的变量
#include "stdafx.h" int i; //全局变量 int y; int main(int argc, char* argv[]) { return 0; }
-
全局变量的特点:
-
在程序编译完以后就已经分配了空间,预留的大小由变量的数据类型决定,且位置不会发生变化
-
全局变量如果没有给的初始值,默认为0
-
全局变量可以在任何其他的函数里面进行读、写
-
多个函数使用同一个全局变量,只要exe程序不结束,里面将一直存储最后一次修改的值
#include "stdafx.h" int m = 10; //全局变量的声明、定义 void Func1(){ m = 15; //写全局变量 printf("%d",m); //15 //读全局变量 } void Func2() { m = 20; } int main(int argc, char* argv[]) { printf("%d",m); //20 return 0; }
-
-
全局变量就是所谓的基址!!(在程序执行时在内存中的地址固定下来)
-
全局变量的反汇编识别:
mov byte/word/dword ptr ds:[0x12345678],寄存器/数
2.局部变量
-
定义在函数内部的变量
-
局部变量的特点:
-
只有当函数调用时才会分配内存空间,且一定要有初值
-
局部变量的作用范围仅限于当前函数自己,其他函数无法使用
-
当函数执行完毕后,局部变量将变成垃圾数据,可以随时被其他数据所覆盖(联想堆栈图)
#include "stdafx.h" void Function1(){ int i = 10; //局部变量的定义、声明 printf("%x",i); //局部变量的读 i = 20; //局部变量的写 }
-