内存
数据类型–更好的内存管理
数据类型:固定大小内存的别名
typedef
结构体的别名 typedef struct Student MyStudent
给指针起别名 typedef char * PCHAR
给变量起别名 typedef longlong mylong_t
注意:
void类型不能typedef
void只能对函数返回和参数的限定
void* 可以指向任何类型的数据(不需要强制转换)
定义一个变量,编译器必须知道分配多少内存
sizeof
返回的是为这个变量开辟的大小
返回数据类型是unsigned int
sizeof计算数组
内存区
内存分区 | 备注 |
命令行参数 | env,args |
栈 ↓ | 高地址向低地址 |
共享库 | |
堆 ↑ | 低地址向高地址 |
未初始化数据段 | .bss |
初始化数据段 | .data |
代码段(静态库) | .text |
受保护头 | (void*)0 |
int a ; // 外部链接
static int a; // 内部链接
"helloworld" //常量区
const修饰的全局变量 // 常量区 一旦初始化 不能修改
程序运行后:
堆区 // 手动开辟 手动释放,程序员不释放,在程序结束,操作系统会释放
栈区 编译器自动分配、释放
全局静态区(全局变量和静态变量是放在一起的,初始化和未初始化会分开存放)
全局区 全局变量(未初始化会成0)
静态区
常量区 不能修改,程序结束由操作系统释放
const char * p = "helloworld"
静态
全局静态变量和局部静态变量都存储在静态区 都在运行期间合法有效
static是内部链接
编译
头文件不参与编译,每一个.c是编译单元
编译器独立编译每一个.c文件
头文件只放声明,不能放定义
extern
不写默认是外连接的(extern)
表示 符号是存在的,先编译通过,让链接器找符号在哪
const
const 全局变量 在常量区 直接间接都不能修改
const 局部变量,在栈上,可以间接修改
volatile
阻止编译器对变量进行优化,每次重新从内存(变量的地址)中获取值
声明:
本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。