结构体的两种声明方式
利用struct关键字声明:
struct heheda
{
char*firstname;
char*lastname;
char*title;
unsigned int age;
};
利用type声明
typedef struct heheda
{
char*firstname;
char*lastname;
char*title;
unsigned int age;
}HEHEDA;
实例化
HEHEDA he;
声明一个HEHEDA的指针并分配内存
HEHEDA *ptrhe;
ptrhe=(HEHEDA*)malloc(sizeof(HEHEDA ));
利用实例访问的时候用"."
he.age=23;
利用结构体指针访问的时候用"->"
ptrhe->age=23;
//也可以解引后再用"."
(*ptrhe).age=23;
为结构体分配内存
结构体的内存至少是各个字段的长度和,不过实际上要大于这个和,因为结构体的各个字段之间可能会有填充。某些数据类型需要对齐到特定边界就会产生填充。
- 要谨慎的使用指针的算术运算
- 结构体数组的元素之间可能存在额外的内存
结构体的释放问题
在为结构体分配内存的时候,系统不会自动的为结构体内部的指针分配内存。类似,当结构体消失时,系统也不会自动释放结构体内部的指针指向的内存。
typedef struct heheda
{
char*firstname;
char*lastname;
char*title;
unsigned int age;
}HEHEDA;
//声明了一个变量,但是3个指针里面包含的是垃圾信息
//即3个指针变量没有被分配内存。
HEHEDA ptr;
/*所以,记住如果动态分配给3个指针变量指向内存,
一定要记得释放空间,防止导致内存泄漏。*/
/*如果用到了结构体指针,动态分配结构体的内存
,在释放3个指针变量指向的内存空间,不要忘记
释放结构体指针指向的内存空间。*/
避免malloc/free的开销
分配一个表来维护结构体
#define length 10
HEHEDA * list[length];
/*
①、先将list这个表初始化,全部赋值NULL;
②、当我们需要结构体时,可以在list里面找非NULL
的元素返回,如果没有非NULL元素,那么将
创建返回一个新的实例。
③、当我们不需要结构体的时候,可以把结构体返回
到表,如果list有NULL元素,就把结构体指针放在
那里,如果没有NULL了,就要释放结构体内的指针,
然后再释放结构体。
*/