内存

数据类型–更好的内存管理
数据类型:固定大小内存的别名

typedef

  1. 结构体的别名 typedef struct Student MyStudent
  2. 给指针起别名 typedef char * PCHAR
  3. 给变量起别名 typedef longlong mylong_t

注意:

  • void类型不能typedef
  • void只能对函数返回和参数的限定
  • void* 可以指向任何类型的数据(不需要强制转换)
  • 定义一个变量,编译器必须知道分配多少内存

sizeof

  • 返回的是为这个变量开辟的大小
  • 返回数据类型是unsigned int
  • sizeof计算数组

内存区

内存分区 备注
命令行参数 env,args
栈 ↓ 高地址向低地址
共享库
堆 ↑ 低地址向高地址
未初始化数据段 .bss
初始化数据段 .data
代码段(静态库) .text
受保护头 (void*)0
1
2
3
4
int a ; // 外部链接
static int a; // 内部链接
"helloworld" //常量区
const修饰的全局变量 // 常量区 一旦初始化 不能修改

程序运行后:

  • 堆区 // 手动开辟 手动释放,程序员不释放,在程序结束,操作系统会释放
  • 栈区 编译器自动分配、释放
  • 全局静态区(全局变量和静态变量是放在一起的,初始化和未初始化会分开存放)
    • 全局区 全局变量(未初始化会成0)
    • 静态区
    • 常量区 不能修改,程序结束由操作系统释放 const char * p = "helloworld"

静态

  • 全局静态变量和局部静态变量都存储在静态区 都在运行期间合法有效
  • static是内部链接

编译

  • 头文件不参与编译,每一个.c是编译单元
  • 编译器独立编译每一个.c文件
  • 头文件只放声明,不能放定义

extern

  • 不写默认是外连接的(extern)
  • 表示 符号是存在的,先编译通过,让链接器找符号在哪

const

  • const 全局变量 在常量区 直接间接都不能修改
  • const 局部变量,在栈上,可以间接修改

volatile

阻止编译器对变量进行优化,每次重新从内存(变量的地址)中获取值