37深入理解C指针之---结构体与指针
一、结构体与指针
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行代码完成结构体指针的返还,如果结构体指针数组已满,自动释放内存,否则,存回结构体指针数组中;
37深入理解C指针之---结构体与指针的更多相关文章
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
- 35深入理解C指针之---结构体基础
一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good
总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- C语言中 指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...
- c语言指针与结构体
#include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- IOS7的变化
API变化: 1.弃用 MKOverlayView 及其子类,使用类 MKOverlayRenderer: 2.弃用 Audio Toolbox framework 中的 AudioSession A ...
- 自定义AlertView的方法和改变Alert的弹出位置以及其宽度
此方法在IOS7中不适合 一.自定义AlertView 1.首先新建一个OC类继承与AlertView. 2.然后再.m中添加方法 - (void)layoutSubviews 可以再这个方法里边改变 ...
- A. Vitya in the Countryside
A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...
- CSS3边框图片-像素虚边的问题
虽然CSS3新增了这个功能,但是在W3school里面并没有给出具体详细的解释,还好网上不乏大神给你我们很全面的解释其中的原理-css3:border-image边框图像详解 边框图片的原理是四个角不 ...
- Python基础学习总结__Day2
一.模块初始 1.标准库模块: (1) Os模块 ① 和操作系统交互:例:执行命令代码 (2) Sys模块 ① 脚本+参数——>结果 2.第三方库模块:Django,Mysql... 存在E:\ ...
- python基本操作(四)
与用户交互 为什么交互? 计算机取代人类,解放劳动力 如何交互 print('-'*100) input('请输入你的姓名:') print(""100) Python2和Pyth ...
- CUB reduce errorinvalid configuration argument
解决CUB reduce errorinvalid configuration argument问题 在写TensorFlow代码时遇到报错 CUB reduce errorinvalid confi ...
- Nginx是用来干什么的?
一.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...
- R-codes-tips
1. 在shell执行R文件 chmod 0755 file.R Rscript file.R 2. 载入数据 data(dune) 3. attach() 将data.frame添加到R的搜索路径 ...
- hihocoder1175 拓扑排序2
#1175 : 拓扑排序·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho所在学校的校园网被黑客入侵并投放了病毒.这事在校内BBS上立刻引起了大家的讨论 ...