当前位置:文档之家› C语言动态分配内存

C语言动态分配内存

};
两个重要的全局变量 堆底,分配块的第一块: void *managed_memory_start; 堆顶,分配块的最后一块 void *last_valid_address;
struct node *p = &b; a.next = b.next; /* 连接a结点和c结点 */ free(p); /* 摘下的b结点一定要释放掉*/
设计一个学生链表,其每个结点是一个学生信 息的集合。每个结点包含如下信息:学生姓名、 学号、C语言成绩三项。初始时拥有3个学生, 添加一个学生(使用一个函数实现此操作),再 删除一个学生(使用另一个函数实现此操作), 并打印该学生的信息。
关键代码:
struct test * p;
p = (struct test *)malloc(sizeof(struct test));
(1)malloc函数是一个库函数,它并不是C语言中 的关键字:
需要头文件<stdlib.h>才可以使用该函数
并不是所有的平台都可以使用该函数,尤其是 一些单片机系统
两个扩展函数:
(1)实现一个链表排序函数,使用冒泡排序的 方法。
(ห้องสมุดไป่ตู้)遍历一个链表,找到链表的中点节点。 (3)寻找某一个节点之前的那个节点
calloc函数 void *calloc( size_t num, size_t size );
relloc函数 void *realloc(void *mem_address, unsigned int newsize);
/* 根据id找到该学生的信息结点 */ /* 将该结点从链表上取下 */ /* 使用res保存该节点 */ /* 释放该结点所占用的内存 */ return 1; /* 成功操作返回1 */ }
(1)实现print函数对其遍历打印链表 (2)实现destroy函数释放每一个链表节点 (3)实现search函数查找链表中的元素 (4)实现一个升级版的insert将元素按顺序插入 (5)实现一个升级版的search函数按顺序查找 (6)实现get_count函数得到链表元素个数
free函数原型: void free(void * p); p是要释放的已分配内存的块的首地址
释放一块动态分配的内存: 例如: int *p; p = (int *)malloc(sizeof(int)); free(p);
(1)free函数同样是一个库函数
(2)free函数的参数必须是一个由动态内存分配 方法分配的内存块的首地址(使用malloc函数 分配的内存)
(2)指针类型转换是必须的,关系到接收分配好 的内存块的地址可以向前看多少字节。
如果不做指针类型转换会怎么样?
void * 指针存在的意义。
(3)内存块大小的可移植性问题
分配一个整型变量数组应使用: 数组元素个数 * sizeof(int) 确定内存块的大小
问题:sizeof和strlen函数的区别
关键代码: int * array;
array = (int *)malloc(10 * sizeof(int));
注意:内存大小不能写成数组元素的个数
例2:定义一个结构 struct test{ int a; char b; int c[10]; };
使用malloc函数分配一个此种结构类型的对象
实现一个可变的数组,从一个键盘输入若干个 数字,以-1结尾。并将其逆序输出。
提示:作为数组的缓冲区的大小是固定的,当 读取的数字的数目超过数组大小的时候需要使 用realloc函数扩展缓冲区数组。
实现一个realloc函数
深入理解动态分配内存的内部机制
进程地址空间
环境变量和命令行参数 栈
堆 数据段 代码段
int insert(char * name, int id, int score) {
/* 分配一个struct std结构对象 */ /* 将参数赋值到结构对应的成员中 */
return 1; /* 正确完成操作,返回1 */
}
int remove(int id, struct std ** res) {
内存空间大小可以是一个变量,其值在运行时 确定
内存空间在运行时分配,在程序结束时收回; 内存的分配由操作系统参与完成
动态分配的内存空间在未释放之前均可以被引 用,保证其生命期
struct node {
int node; /* 数据域,存储结点的值 */ struct node * next; };
分配原则——最先适合分配方法 malloc内部调用sbrk()系统调用 一个进程使用一个堆,所有内存由操作系统管

问题:如果申请一个内存并没有释放,当进程 结束运行的时候,会造成内存泄露么吗?
内存控制块结构定义:
struct mem_control_block { int is_available; /* 该块是否可用 */ int size; /* 该块的大小 */
结点结构: struct info{
char name[10]; int id; int score; }; struct std{ struct info; struct std * next; };
main函数: int main(void) {
/* 初始化学生链表 */ /* 插入一个学生信息结点 */ /* 删除一个学生的信息,并且打印 */ return 0; }
value 1
value 2
value 3
value 4 NULL
动态申请内存:void * malloc(size_t n); 释放动态内存:void free(void *);
struct node *p = &b; a.next = p; /* 连接a结点和b结点 */ b.next = &c; /* 连接b结点和c结点 */
C语言动态分配内存
什么时候需要动态分配内存?
实例:顺序对一批文件进行解析,但是不知道 文件的大小,如何建立缓冲区?
malloc函数原型:
void * malloc(size_t n);
n是要分配的内存的大小,返回值是分配内存的 块的首地址
例1:使用malloc函数分配一个可以容纳10个整 型元素的内存空间,并将其用作一个整型数组
相关主题