C/C++程序内存的各种变量存储区域和各个区域详解
C语言在内存中一共分为如下几个区域,分别是:
- 内存栈区: 存放局部变量名;
- 内存堆区: 存放new或者malloc出来的对象;
- 常数区: 存放局部变量或者全局变量的值;
- 静态区: 用于存放全局变量或者静态变量;
- 代码区:二进制代码。
全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起;
普通局部变量保存在堆栈中;
全局变量与局部变量
全局变量(Global Variable):定义:所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件,包括.c和.h文件。
局部变量(Local Variable):定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。
常见问题
- 在main函数中定义的变量也是局部变量,只能在main函数中使用;同时,main函数中也不能使用其他函数中定义的变量。main函数也是一个函数,与其它函数地位平等。
-形参变量、在函数体内定义的变量都是局部变量,实参给形参传值的过程也就是给局部变量赋值的过程。
-可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互补干扰,也不会发生混乱。
-在语句块(由一对{}包含的若干条语句)中也可以定义变量,它的作用域只限于当前的语句块。
堆栈
堆和栈都是动态分配内存,两者空间大小都是可变的。
Stack: 栈,存放Automatic Variables,按内存地址由高到低方向生长,其最大大小由编译时确定,速度快,但自由性差,最大空间不大。栈是用于存放临时变量和函数调用的。栈也是一种先进后出的数据结构,函数的递归调用正得益于栈的存在。需注意存在栈的数据只在当前函数和子函数中有效,一旦函数返回数据将会被自动释放。
Heap: 堆,自由申请的空间,按内存地址由低到高方向生长,其大小由系统内存/虚拟内存上限决定,速度较慢,但自由性大,可用空间大。 每个线程都会有自己的栈,但是堆空间是共用的。堆的使用周期有使用者控制,程序中的内存泄漏多因程序员对堆的管理不当引起,需谨慎。
局部变量、全局变量、静态变量、堆、栈的内存地址
1、ubuntu中创建一个源文件(vim 名字)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void before()
{
}
char g_buf