微软100题(98)malloc实现

来源:互联网 发布:mac上的音乐播放器 编辑:程序博客网 时间:2024/05/23 19:22
第2组微软面试题
1.给出一个函数来输出一个字符串的所有排列。
2.请编写实现malloc()内存分配函数功能一样的代码。
3.给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 
4.怎样编写一个程序,把一个有序整数数组放到二叉树中? 
5.怎样从顶部开始逐层打印二叉树结点数据?请编程。 
6.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

1、参见全排列和组合数
http://blog.csdn.net/liuqing0517/article/details/45720777

2、参见
http://lklkdawei.blog.163.com/blog/static/32574109200881445518891/

我们知道调用malloc()后,OS就要想方设法为我们返回一块空闲空间。这就涉及到OS的内存管理。OS的内存管理可以这样考虑:
假设整块内存有128K
初始状态,128K都是空闲
第一次请求,申请了16k,空闲112K
第二次请求,申请了32K,空闲80K
第三次请求,申请了8K,空闲72K
第二次请求申请的32K被释放,空闲108K
第四次请求,申请了24K,空闲84K

从上面的例子可以看出,一整块连续的空闲内存块,经过一段时间的使用,会被无情的划分为许多小块。这些小块大小不等,并且有的空闲、有的被占用。

当调用malloc时,OS就沿内存扫描,找到一块够大的空闲块,从中划分出要使用的部分,将这部分标记为己分配,并返回这部分的首地址。如果,空闲的块都是些小的碎片,那就悲具了(当然,OS可以把将相邻的空闲块合并,再尝试)。
现在,模拟一下malloc的过程:
为了便于管理,首先定义内存控制块mcb。这个mcb记录两个信息:块是否空闲、块的大小。即,每个分配出去的块,其实都带有一个mcb,只不过这个mcb位于块的最前端,返回该用户的指针刚好指向mcb之后,所以对用户是不可见的。
现在,就可以处理free了。Free只要把已分配的内存块重新标记为空闲即可,这里当然要用到该快的mcb了。
Malloc简单来说,就是维护几个指针,根据分配请求修改指针位置。对于要分配的块,将标记置位己分配,并返回这部分的首地址。

3.memmove函数的实现

4、中间开始,分左右递归

5、层序遍历,用队列

6、链表逆序
0 0
原创粉丝点击