一、变量类型:
1.生命周期
指的是变量值保留的期限。按照生命周期,可将变量分为两类:静态变量和动态变量。
静态变量: 静态变量存储在内存中的静态存储区,在编译的时候就分配了存储空间,在整个程序运行期间,该变量占有固定的内存单元,变量的值都始终存在,直到程序结束后,这部分空间才释放出来。因此,静态变量的生命周期为整个程序运行的时间。
动态变量: 动态变量存储在内存的动态存储区,在程序运行过程中·,只有当变量所有函数被调用时,编译系统才会临时为该变量分配一段内存单元,该变量才有值,函数调用结束,变量值立即消失,这部分空间释放。因此,动态变量的生命周期仅在函数调用期间。
在C语言中,具有静态存储性质的变量:外部变量、静态全局变量、静态局部变量。
在C语言中,具有动态存储性质的变量:自动变量(auto)、寄存器变量(register)。
2.作用域
指的是变量的有效范围,可将变量分为两种:局部变量和全局变量。
局部变量: 在一个函数或复合语句内定义的变量,局部变量仅在定义它的函数或复合语句内有效。
全局变量: 定义在所有函数之外的变量,作用范围是从定义开始,直到程序的结束。
· 在C语言中,局部变量有:自动变量、寄存器变量和内部静态变量。
· 在C语言中,全局变量有:外部变量、外部静态变量。
3.变量
C语言的变量有:自动变量、寄存器变量、外部变量、静态内部变量和静态外部变量
二、内存管理:
一般来说,我们可以将内存分为三个部分:静态区、栈、堆。
静态区: 保存自动全局变量和static变量。静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。
栈: 保存局部变量。栈上的内容只在函数范围内存在,也就是说,当函数运行结束的时候,这些内容也会自动销毁。
堆: 由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。
1.缓冲区溢出问题
计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。
言简意涵,缓冲区溢出可以换一种说法,叫做存储数据的某一部分内存溢出,而内存的范围就是我们上面说到的静态区、栈和堆,也就是说缓冲区溢出包含了溢出问题这一大类,即我们上面所说的静态区越界,栈越界,堆越界。