正在加载图片...
其中的 sizeof( struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度 分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps 2.释放内存空间函数free 调用形式: 功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释 放区域的首地址。被释放区应是由 malloc或 calloc函数所分配的区域 【例11.8】分配一块区域,输入一个学生数据。 ar name char sex float score (struct stu)) ps->numF102 ps->score=62.5 printf(Number%d\ Name=%s\n", ps->num, ps->name printf(" Sex=c\nScore=%f\n", ps->sex, ps->score) free(ps) 本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区, 并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用 printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存 空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配 119链表的概念 在例7.8中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用 来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存 空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能 准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占 用的空间从数组中释放出来 用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确 定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约 了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分 配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。即其中的 sizeof(struct stu)是求 stu 的结构长度。因此该语句的意思是:按 stu 的长度 分配 2 块连续区域,强制转换为 stu 类型,并把其首地址赋予指针变量 ps。 2. 释放内存空间函数 free 调用形式: free(void*ptr); 功能:释放 ptr 所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释 放区域的首地址。被释放区应是由 malloc 或 calloc 函数所分配的区域。 【例 11.8】分配一块区域,输入一个学生数据。 main() { struct stu { int num; char *name; char sex; float score; } *ps; ps=(struct stu*)malloc(sizeof(struct stu)); ps->num=102; ps->name="Zhang ping"; ps->sex='M'; ps->score=62.5; printf("Number=%d\nName=%s\n",ps->num,ps->name); printf("Sex=%c\nScore=%f\n",ps->sex,ps->score); free(ps); } 本例中,定义了结构 stu,定义了 stu 类型指针变量 ps。然后分配一块 stu 大内存区, 并把首地址赋予 ps,使 ps 指向该区域。再以 ps 为指向结构的指针变量对各成员赋值,并用 printf 输出各成员值。最后用 free 函数释放 ps 指向的内存空间。整个程序包含了申请内存 空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。 11.9 链表的概念 在例 7.8 中采用了动态分配的办法为一个结构分配内存空间。每一次分配一块空间可用 来存放一个学生的数据,我们可称之为一个结点。有多少个学生就应该申请分配多少块内存 空间,也就是说要建立多少个结点。当然用结构数组也可以完成上述工作,但如果预先不能 准确把握学生人数,也就无法确定数组大小。而且当学生留级、退学之后也不能把该元素占 用的空间从数组中释放出来。 用动态存储的方法可以很好地解决这些问题。有一个学生就分配一个结点,无须预先确 定学生的准确人数,某学生退学,可删去该结点,并释放该结点占用的存储空间。从而节约 了宝贵的内存资源。另一方面,用数组的方法必须占用一块连续的内存区域。而使用动态分 配时,每个结点之间可以是不连续的(结点内是连续的)。结点之间的联系可以用指针实现。即
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有