一 内存分布
w- 写 r - 读 e - 执行 s - 共享
1.1.同个程序同时运行多个实例,它们之间的内存是相互隔离的,同一个变量的值互补干扰。
1.2.早前微软对内存中数据的属性:e - 执行不做检查,内存中能访问到的数据都可以作为代码来执行,这样其实可以在很多地方去构造想要执行的代码,通过修改函数的返回地址,或者修改程序中的跳转,将执行地址定位到构造好的位置,从而实现了内存代码注入的效果。微软在后来修复了这个纰漏,推出了Dep即数据执行保护(可研究绕过方法)
二、作用域 与 生命周期
- 进程作用域:如:全局变量
- 文件作用域:跨文件 extern
- 函数作用域:参数和局部变量
- 块作用域:用一对大括号囊括在内的区域
int g_nValue = 1024;
//g_nValue进程作用域,生命期从载入程序到进程结束
void fun(int ary[], int nLen)
{
g_nValue = 199;//全局变量,函数内部也可以使用
}
int main()
{
int nCnt = 9;
{
int nCnt = 7;//作用域在当前括弧内,生命期与外部int nCnt = 9相同
printf("%d", nCnt);
}
{
printf("%d", nCnt);//访问int nCnt = 9
}
return 0;
}
三 寄存器变量
当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。
1.只有局部自动变量和形参才可以定义为寄存器变量。
因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量。
2.register是一个”建议”型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个”建议”型关键字:inline)。
3.对于寄存器变量,在Debug环境中,均没有将变量地址设置为寄存器,主要考虑Debug环境中的调试功能
但是在Release环境下,不管有没有将变量设置为register类型,均会优先将变量地址设置到寄存器地址
百度百科:
http://baike.baidu.com/link?url=nK-T4_6k8MEZyln3k7kjO6cqsP2R3Jf5b8fTLgxRDJwikCkvW9-W2AhVuzocxQ7ZZZCUaiRnmesYSaQYD-QS2KqFKWV0D2Jda3dhTu8JpFG535i3LbWgHF2Ch8PgZEzxXbPhBtqI1Sa3-z8IoNTvGq