您的位置:首页 > 其它

天人合一之毕设——准备阶段——1 初识malloc

2018-01-28 13:34 197 查看
     之前上C语言课只简单知道malloc是程序员用来自动分配内存,没有过多关注,自己写代码也压根不会深入的往栈啊堆啊内存方面考虑。目前毕设做的关于异构内存方面的研究,主要是考虑堆区的优化,所以malloc就不可无视啦。

1、函数声明

void *malloc(int size);

说明:malloc向系统申请分配size字节的内存空间,如果分配成功则返回指向被分配内存空间的指针,不然返回空指针NULL

2、使用

分配100个int类型的空间:

int *p;

p = (int *)malloc( sizeof(int) * 100 );

free(p);

注意:

(1)因为malloc返回的是不确定类型的指针,所以返回之前必须经过类型强制转换,否则编译报错,如:“ 不能将void*赋值给int*变量 ”。

(2)malloc只管分配内存,并不会初始化,其内存空间中的值可能是随机的,经常会使用memset()进行置0操作后再使用。如果分配的这块空间原来没有被使用过,那么其中每个值都可能是0。相反,空间里面可能遗留各种各样的值。

3、工作机制

(1)malloc函数被调用时,它会沿空闲链表寻找一个可以满足需求的内存块,然后把所需大小的内存块分配给用户,剩下的返回到链表上。free函数被调用时,它将释放的内存块连接到空闲链表上。

(2)到最后,空闲链表会被分成很多小的内存片段,当用户申请一块较大的内存空间时,空闲链表上可能没有满足需求的内存块了,这时,malloc函数请求延时,并将空闲链表内的小内存片段整理成大的内存块,最终返回。如果无法获得符合用于要求的内存空间,那么malloc()函数就会返回NULL,因此,调用malloc()函数的时候,一定要判断它的返回值是否为NULL。

(3)malloc是通过调用brk或mmap这两种syscall之一来获取内存的。

4、与malloc以及相关的几个函数    

       void free(void *ptr);

       void *calloc(size_t nmemb, size_t size); 

 相当于malloc一段内存,然后将数据区内容置为0(区别就是calloc参数有两个,而且初始化为0)

       void *realloc(void *ptr, size_t size);

        实现内存大小调整
 注意:这些都是标准库函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: