一、结构体与指针
1、结构体的高级初始化、结构体的销毁、结构体池的应用
2、特征:
1)、为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装;
2)、封装函数主要实现内存的分配和成员的初始化;
3)、为了避免含有指针成员的结构体指针的释放内存复杂操作,将所有初始化动作使用函数封装;
4)、封装函数主要实现分配内存的释放;
5)、避免频繁的malloc和free的任务开销,一般使用结构体池技术;
3、结构体的高级初始化应用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct _student{
char *name;
char *address;
int age;
short id;
char sex;
} Student; void initializeStudent(Student *student, const char *nameg, const char *addressg, const int ageg, const short idg, const char sexg){
student->name = (char *)malloc(strlen(nameg) + );
strcpy(student->name, nameg);
student->address = (char *)malloc(strlen(addressg) + );
strcpy(student->address, addressg);
student->age = ageg;
student->id = idg;
student->sex = sexg; return;
} void displayStudent(Student *student){
printf("student %s info:\n", student->name);
printf("student.name: %s\n", student->name);
printf("student.address: %s\n", student->address);
printf("student.age: %d\n", student->age);
printf("student.id: %d\n", student->id);
printf("student.sex: %c\n", student->sex);
printf("\n"); return;
} void deallocateStudent(Student *student){
free(student->name);
free(student->address); return;
} int main(int argc, char **argv)
{
Student student;
initializeStudent(&student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(&student);
deallocateStudent(&student); return ;
}
代码说明:
1)、第5-11行是结构体定义
2)、函数initializeStudent()主要完成结构体的初始化,使用时只要根据参数的类别和顺序传入合适的参数即可;
3)、函数deallocateStudent()主要完成结构体的销毁工作,使用时传入结构体变量即可;
4)、函数displayStudent()主要是实现结构体内容的格式化输出;
5)、函数main完成对以上3个函数的调用及测试,其中第46行是对结构体变量的声明;
6)、测试函数中,若声明的是结构体指针变量时,将测试部分换成如下代码段即可;
int main(int argc, char **argv)
{
Student *student = (Student *)malloc(sizeof(Student));
initializeStudent(student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(student);
deallocateStudent(student); return ;
}
4、结构体的销毁应用:
1)、函数deallocateStudent()的具体实现;
2)、释放内存的顺序与分配的顺序完全相反即可;
5、结构体池技术的应用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_SIZE 10 typedef struct _student{
char *name;
char *address;
int age;
short id;
char sex;
} Student; void initializeStudent(Student *student, const char *nameg, const char *addressg, const int ageg, const short idg, const char sexg){
student->name = (char *)malloc(strlen(nameg) + );
strcpy(student->name, nameg);
student->address = (char *)malloc(strlen(addressg) + );
strcpy(student->address, addressg);
student->age = ageg;
student->id = idg;
student->sex = sexg; return;
} void displayStudent(Student *student){
printf("student %s info:\n", student->name);
printf("student.name: %s\n", student->name);
printf("student.address: %s\n", student->address);
printf("student.age: %d\n", student->age);
printf("student.id: %d\n", student->id);
printf("student.sex: %c\n", student->sex);
printf("\n"); return;
} void deallocateStudent(Student *student){
free(student->name);
free(student->address); return;
} Student *listStu[LIST_SIZE]; void initializeListStu(){
for(int i = ; i < LIST_SIZE; i++){
listStu[i] = NULL;
}
} Student *getStudent(){
for(int i = ; i < LIST_SIZE; i++){
if(listStu[i] != NULL){
Student *stu = listStu[i];
listStu[i] = NULL; return stu;
}
}
Student *student = (Student *)malloc(sizeof(Student)); return student;
} Student *returnStudent(Student *student){
for(int i = ; i < LIST_SIZE; i++){
if(listStu[i] == NULL){
listStu[i] = student; return student;
}
}
deallocateStudent(student);
free(student); return NULL;
} int main(int argc, char **argv)
{
initializeListStu();
Student *student;
student = getStudent(); initializeStudent(student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(student);
returnStudent(student); return ;
}
代码说明:
1)、第45行声明结构体Student指针数组,数组大小使用宏定义;
2)、函数initializeListStu()完成数组的初始化;
3)、函数getStudent()完成从数组中取得结构体指针,若数组中所有指针都为NULL,临时分配空间,并返回指针;
4)、函数returnStudent()完成将不需要的结构体指针存回到结构体指针数组中,若数组已满,将指针释放;
5)、第83行代码完成结构体指针数组的初始化;
6)、第84行代码声明结构体指针;
7)、第85行代码完成从结构体指针数组中获取结构体指针;
8)、第87行代码完成结构体指针的初始化;
9)、第88行代码完成结构体指针内容的打印输出;
10)、第89行代码完成结构体指针的返还,如果结构体指针数组已满,自动释放内存,否则,存回结构体指针数组中;