一、虚拟内存的区域划分
32位操作系统虚拟内存是4G,分为系统占用空间和局部变量占用空间(栈区),动态划分空间(堆区),全局变量/静态局部变量占用空间(全局/静态存储区),字符串/数字常量占用空间(文字常量区)和程序代码占用空间(代码区)。
虚拟内存存储区域划分见图:
二、变量相关修饰符
1.auto
修饰局部变量(存储在内存的栈区),平常一般省略。
生命周期是最近的{}内,初始值是随机值。
#include<stdio.h>
void zaizai()
{
auto int a=100;
int b=110;
printf("auto int a=%d,int b=%d\n",a,b);//a与b都是auto修饰的局部变量
}
int main()
{
auto int a=10;
int b=11;
printf("auto int a=%d,int b=%d\n",a,b);//a与b都是auto修饰的局部变量
zaizai();
return 0;
}
2.extern
声明全局变量或函数;全局变量或函数在跨文件调用时需要提前extern声明一下。
例如:在test.c中定义全局变量a和函数zaizai();
int a=100;//全局变量
void zaizai()
{
int b=110;
printf("auto int a=%d,int b=%d\n",a,b);
}
在man.c中调用全局变量a和函数zaizai()需提前声明一下才可以;
#include<stdio.h>
extern int a;//生命全局变量a
extern void zaizai();//声明函数zaizai()
int main()
{
zaizai();
printf("全局变量a=%d",a);
return 0;
}
3.static
修饰全局变量或函数
作用域,仅在该文件内可用;(全局变量/函数作用域是整个项目文件)
生命周期是整个项目周期;
#include<stdio.h>
extern int a;//声明全局变量a不报错
extern void zaizai();//声明函数zaizai()不报错
int main()
{
//zaizai();//调用函数报错
//printf("全局变量a=%d",a);//调用全局变量a报错
return 0;
}
修饰局部变量
当修饰局部变量时,改变了在内存中的存储区域(静态局部变量存储在static局部/全局区)
改变了生命周期,静态局部变量生命周期为整个项目周期。
#include<stdio.h>
int main()
{
int i=0;
while(i<10)
{
int a=1;//局部变量a每次会重新定义
static int b=1;//静态局部变量b只在第一次定义,之后该定义语句不再生效。
printf("int a=%d,static int b=%d\n",a,b);
a++;
b++;
}
}
4.register
修饰寄存器变量;(有可能不成功,当寄存器被占用时则失败,失败则自动转为auto类型变量)
只能修饰局部变量;
效率一般更高;因为省略了内存到寄存器数据搬运的过程
#include<stdio.h>
int main()
{
register a=10;//定义寄存器类型变量a
printf("register类型变量a=%d",a);
return 0;
}