一、结构体与指针

    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指针之---结构体与指针的更多相关文章

  1. 36深入理解C指针之---结构体的内存处理

    一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...

  2. 35深入理解C指针之---结构体基础

    一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...

  3. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  4. 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

    总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...

  5. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  6. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  7. C语言中 指针与结构体

    就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. c语言指针与结构体

    #include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...

  9. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

随机推荐

  1. 我的offer之路(一)

    目录 1.职业规划. 2.刷题. 3.看书. <剑指offer> <数据结构算法与应用:C++语言描述 > <Effective C++> <C与指针> ...

  2. 安装ElasticSearch 6.1.1 head插件

    https://blog.csdn.net/zoubf/article/details/79007908 主要参考了这个blog 才完成所有的配置,很好的参考资料

  3. OpenCV中的绘图函数

    OpenCV可以用来绘制不同的集合图形,包括直线,矩形,圆,椭圆,多边形以及在图片上添加文字.用到的绘图函数包括 cv2.line(),cv2.circle(),cv2.rectangle() ,cv ...

  4. (转)git常见错误

      error: src refspec master does not match any. 引起该错误的原因是,目录中没有文件,空目录是不能提交上去的 error: insufficient pe ...

  5. HDU - 1251 统计难题(Trie树)

    有很多单词(只有小写字母组成,不会有重复的单词出现) 要统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 每个单词长度不会超过10. Trie树的模板题.这个题内存把控不好容易MLE. ...

  6. Linux磁盘简介

    为一台服务器添加三块磁盘的体系结构情况 Linux系统中用free  -l 查看磁盘的状况 说明:   1)buffers为写入缓冲区,sync将缓冲区数据写入磁盘,cache为读出缓存. 2)cac ...

  7. Linux学习-检验软件正确性

    md5sum / sha1sum / sha256sum 目前有多种机制可以计算文件的指纹码,我们选择使用较为广泛的 MD5, SHA1 或 SHA256 加密机 制来处理,我们拿NTP 软件来检查看 ...

  8. Ubuntu下安装anaconda和pycharm

    折腾了一上午,终于装好了,如下:Python环境的安装: 安装anaconda 建议去https://www.anaconda.com/download/#linux直接用Ubuntu界面的搜狐浏览器 ...

  9. luogu2951 noip2017 小凯的疑惑

    在考场上我们可以打表发现规律是 $ ab-a-b $ .下面给出证明(看的网上的). 若有正数 $ x $ 不能被 $ a $ , $ b $ 组合出,假设 $ a>b $ ,则存在 \[ x= ...

  10. 大数据学习——actor编程

    1 概念 Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息(message)的发送.接收来实现多线程的.使用Scala能够更容易地实现多线程应用的开 ...