内存分部如下图所示
内存分部
代码段:存放指令
数据段:存放局部变量、形参、全局变量、静态变量
静态变量:定义时使用 static
关键字定义,只初始化一次,之后不会再被调用时不再初始化,如果在定义时不进行初始化,数类型自动初始化为0,字符型自动初始化为空字符,局部静态变量之作用于所属局部函数,但是所占内存空间不会被释放。static 修饰的变量(静态)变量作用范围在该变量所在的最大范围内。
static 全局变量 —–只作用在该文件程序中
static 局部变量 —–只作用在该函数内
static 函数 —–该函数只能作用在该文件程序中
数据段:存放全局变量、静态变量
数据段里有.data .bss .rodata三段,其各段的作用如下
.data 存放初始化的全局变量和静态变量
.bss 存放未初始化的全局变量和静态变量
.rodata 存放常量
堆:
动态分配空间(malloc(),calloc(),realloc();)
内存从低位开始分配,空间使用完后,一定要使用free()释放,如果不释放,这空间一直存在到程序退出。
void *malloc(size_t size);向系统申请size个字节的内存空间,返回所申请内存的起始指针地址,
void *calloc(size_t nmemb, size_t size); 申请空间 nmemb*size大小空间,自动清0。nmemb是申请空间的个数,size是申请内存的大小。
void *realloc(void *ptr, size_t size); 当初始申请的内存不够用时,使用realloc调整空间大小。
栈:存放局部变量、形参
自动分配内存,地址从高位开始,当局部变量或形参生命结束时自动释放
函数{}中定义的变量(局部变量),一声明好,系统自动分配一个空间,当局部变量生命一结束,系统自动把空间回收。
形参:
int f(int a,int b)
{
//当f函数被调用时,参数传递给a和b,a、b就是形参
}
例:
test.c
-------------
struct A
{
int a;
int b;
};
int a=4; //数据段.data
int c; //数据段.bss
struct A * f(int q)
{
static int w=1; //数据段.data
static int d; //数据段.bss
int aa=4; //栈
struct A *p=malloc(sizeof(struct A)); //堆
return p;
}
int main()
{
struct A p1; //栈
struct A *pp=f();
}
博客的文章都会发到个人订阅号上,欢迎关注