c语言类型修饰符及内存
今天来学习一下c语言类型修饰符及内存分布
1、auto int a;
默认在内存
2、register int a;
限制变量定义在寄存器上的修饰符
编译器会尽量安排CPU的寄存器去存放这个a,如果寄存器不足,a还是放在内存中
取地址符号&对a不起作用
3、static
应用场景:
1、函数内的变量
2、函数外的变量
3、函数的修饰符(函数也是一个变量)
int fun() --> static int fun()
第一、修饰局部变量的时候,局部变量不在栈空间,放到全局的数据段,延长了局部变量的生命周期,直到程序运行结束以后才释放。
第二、static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
第三、static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0;
4、const
只读的变量
const char *p;// p可以变,指向的内容不可变,主要用于字符
char * const p; //p不可以变,指向的内容可以变,主要用于硬件资源(LCD)
双引号是整型常量,相当于const
char *p="hello world";
*p='a';会报错,不能对修改常量
5、volatile
告知编译器编译方法的关键字,不优化编译
修饰变量的值的修改,不仅仅可以通过软件,也可以通过其他方式(硬件外部的用户)
volatile char *p;
while(*p ==0x00);//当按键按下后,跳出循环
…
会一直判断,而不会被系统优化掉,变成死循环
内存
——————————————————————
内核空间 应用程序不允许访问
——————3g
栈空间 局部变量
————
运行时的堆空间 malloc
————
全局的数据空间(初始化,未初始化)
只读数据段 “hello world” 静态空间
代码段 code
————
0x00
——————————————————————
堆、栈、制度空间
栈空间
局部变量存储在栈空间中,当函数执行完后,局部变量出栈,相当于失效了
生存周期短
堆空间
运行时,可以自由,自我管理的分配和释放的空间,生存周期是由程序员来决定
分配 malloc(),返回分配好的地址
char *p;
p=(char *)malloc(5*sizeof(char));
if(p == NULL){
error
}
最后必须用free(p);把空间释放, 防止内存泄漏