关于“已分配内存块起始地址”含义及freeMemory校验逻辑的问询
关于freeMemory函数中“已分配内存块起始地址”的含义及校验逻辑疑问
问题描述
我正在完成一项编程作业,涉及到内存管理的freeMemory函数,现有代码定义如下:
typedef struct ELEMENT { int addr; int size; struct ELEMENT * next; } ELEMENT; int freeMemory (ELEMENT ** freeList, ELEMENT ** allocList, int addr) /* pre: Parameter addr must match the start of an allocated memory block.Otherwhise return -1. * post: If addr is a part of allocated memory of allocList then the memory from this address * with registered nrofBytes should be removed from the *allocList and added to the *freeList * * freeMemory(freeList,allocList,addr) returns number of bytes belonging to the address addr * In all other cases freeMemory(freeList,allocList,addr) returns -1. */
我想询问此处注释里提到的“已分配内存块的起始地址”具体指什么?我猜测需要通过if(node->addr == addr)来做校验,但不确定是否符合作业要求。
解答
你完全猜对了,这里的“已分配内存块的起始地址”就是指allocList链表中每个ELEMENT节点里addr字段存储的数值——这个值是当初分配该内存块时记录的起始地址,每个已分配的内存块都会在allocList里有对应的节点,节点的addr就是这个块的起始位置。
所以你的校验思路if(node->addr == addr)完全符合作业要求:
- 你需要遍历
allocList链表,逐个检查每个节点的addr字段是否等于传入的addr参数; - 如果找到匹配的节点,说明这个节点对应的内存块就是要释放的目标:你需要把它从
allocList中移除,然后添加到freeList中,最后返回该节点的size值; - 如果遍历完整个
allocList都没找到匹配的节点,说明传入的addr不是任何已分配块的起始地址,直接返回-1即可。
另外要注意操作链表时的边界情况,比如要释放的节点是allocList的头节点,或者是中间节点,处理移除逻辑时要保证链表的完整性哦。
内容的提问来源于stack exchange,提问作者Bujigh
相关产品推荐
相关产品推荐

