在正式开始今天的博文之前,先看一段代码,思考这段代码有可能出现的情况:
int main() { int j, b[10]; for(j = 1; j <= 10; ++j){ b[j] = 0; } }
我们在C/C++中学的变量分三种:局部变量、全局变量(静态变量和全局变量)、堆变量
局部变量 由 程序员定义普通变量时编译器在内存中的栈空间为其分配一段内存,如:int b[10], j;
全局变量 由编译器在内存中的静态存储区分配空间,如:
int x, y; // 全局
int main(){
static int m, n; // 静态
}
堆变量 由程序员用malloc或new在堆上申请一段内存空间,如:
int *a = new int[10], *i = new int; // 动态内存分配
可见编译器通过将内存逻辑划分为不同区段来提供程序员访问内存的权限,而每段空间都有各自的大小,一旦程序员在使用过程中将该大小哦耗尽,就会出现内存不足错误,比如典型的Stack OverFlow
了解了变量的存储后,再来思考一个问题,当我在同一个变量区定义几个不同变量时,他们在内存中是如何排列的?
比如我定义两个局部变量
int a,b;
那么到底是编译器先为a分配地址,还是先为b地址分配?(这还用思考吗?肯定是先定义的先分配啦)分配地址后,到底是a的地址高于b的地址,还是b的地址高于a的地址?也就是下面这两张图哪张图是正确的?
想知道答案只需要将这两个的地址分别打印出来查看一下即可。这里小编就不打印了,建议读者自行打印。
打印结果是a的地址高于b的地址,也就是说左图正确。
但是注意这里的a,b均是局部变量,也就是变量存储在栈区,根据结果我们发现在栈区定义的变量是先定义的变量分配在高地址区域,后定义的变量被分配在低地址区域(左图)