结构体
一般形式
struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
};
特点:
- 结构体类型是用户自定义的
- 由若干不同 的基本数据类型的数据构成
- 属于C语言的一种数据类型,与整型、实型相当。定义结构体时不分配空间,只有用它定义变量时才分配空间。
定义结构体变量方法:
- 先定义结构体再定义变量
struct worker{
...
...
};
struct worker w1,w2;
- 定义结构体类型同时定义变量
struct student{
...
}s1,s2;
- 直接定义结构体变量
struct{
...
}s3,s4;
结构体变量的初始化
//example1
struct 结构体名 变量名 = {初始化列表};
//example2
struct 结构体名{
成员列表
}变量名 = {初始数据列表};
共用体
不同数据类型可以使用共同的存储区域,成员使用共同存储空间。
定义共用体方法和定义结构体方法一样;
共用体占内存大小为共用体内占内存最大的成员的大小
共用体内存的值为最后一次赋值其成员的值
typedef
语法:
typedef <已有数据类型> <新数据类型>
typedef struct old_data_type{
...
}new_data_type1,*new_data_type2;
内存管理
动态内存
- 代码区
- 全局变量与静态变量区
- 局部变量区即栈区
- 动态存储区即堆区
静态存储区:通常定义变量,编译器在编译时根据该变量的类型知道所需要内存空间大小,从而系统在适当的时候为之分配确定的存储空间。
栈区:在栈上创建,执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
堆:程序运行时才能知道其大小,系统根据运行时的要求进行内存分配。malloc申请,free释放。堆在申请空间时不会自动初始化,所以在malloc时必须对其初始化。
malloc/free注意事项
free(p),实际是指删除了p所指向的目标(变量或对象),释放了它所占的堆空间,而不是删除p本身,释放堆空间后,p编程空悬指针。
同一空间重复释放也是危险的,该空间可能已另被分配。
必须保证不发生内存泄漏,也不发生重复释放堆空间。
野指针:
- 指针变量没有初始化
- 指针p被free之后,没后置NULL,后续操作误以为p是合法指针
- 指针操作超越了变量的作用范围。
L2-D4