C语言内存控制API函数

目录

配置内存地址

释放原先配置的内存

取得内存分页大小

配置内存空间

建立内存映射

解除内存映射


配置内存地址

头文件

#include <stdlib.h>

函数原型

void *calloc(size_t nmemb, size_t size); 

函数说明

calloc()用来配置nmemb个相邻的内存单位, 每一单位的大小为size, 并返回指向第一个元素的指针. 这和使用下列的方式效果相同:malloc(nmemb*size);不过, 在利用calloc()配置内存时会将内存内容初始化为0.

返回值

若配置成功则返回一指针, 失败则返回NULL

释放原先配置的内存

头文件

#include <stdlib.h>

函数原型

void free(void *ptr);

函数说明

参数ptr为指向先前由malloc()、calloc()或realloc()所返回的内存指针. 调用free()后ptr 所指的内存空间便会被收回. 假若参数ptr所指的内存空间已被收回或是未知的内存地址, 则调用free()可能会有无法预期的情况发生. 若参数ptr为NULL, 则free()不会有任何作用.

取得内存分页大小

头文件

#include <unistd.h>

函数原型

size_t getpagesize(void);

函数说明

返回一分页的大小, 单位为字节(byte). 此为系统的分页大小, 不一定会和硬件分页大小相同. 返回值 内存分页大小. 在Intel x86 上其返回值应为4096bytes.

配置内存空间

头文件

#include <stdlib.h>

函数原型

void *malloc(size_t size);

函数说明

malloc()用来配置内存空间, 其大小由指定的size决定.

返回值

若配置成功则返回一指针, 失败则返回NULL.

建立内存映射

头文件

#include <unistd.h>
#include <sys/mman.h> 

函数原型

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);

函数说明

mmap()用来将某个文件内容映射到内存中, 对该内存区域的存取即是直接对该文件内容的读写.

参数 start指向欲对应的内存起始地址, 通常设为NULL, 代表让系统自动选定地址, 对应成功后该地址会返回.

参数 length代表将文件中多大的部分对应到内存.

参数 prot代表映射区域的保护方式有下列组合

        PROT_EXEC 映射区域可被执行

        PROT_READ 映射区域可被读取

        PROT_WRITE 映射区域可被写入

        PROT_NONE 映射区域不能存取

参数 flags会影响映射区域的各种特性

        MAP_FIXED如果参数start所指的地址无法成功建立映射时, 则放弃映射, 不对地址做修正. 通常不鼓励用此旗标.

        MAP_SHARED 对应射区域的写入数据会复制回文件内, 而且允许其他映射该文件的进程共享.

        MAP_PRIVATE 对应射区域的写入操作会产生一个映射文件的复制, 即私人的"写入时复制" (copy on write)对此区域作的任何修改都不会写回原来的文件内容.

        MAP_ANONYMOUS 建立匿名映射. 此时会忽略参数 fd, 不涉及文件, 而且映射区域无法和其他进程共享.

        MAP_DENYWRITE 只允许对应射区域的写入操作, 其他对文件直接写入的操作将会被拒绝.

        MAP_LOCKED 将映射区域锁定住, 这表示该区域不会被置换(swap).

在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE.

参数fd为open()返回的文件描述词, 代表欲映射到内存的文件.

参数offset为文件映射的偏移量, 通常设置为0, 代表从文件最前方开始对应, offset 必须是分页大小的整数倍.

返回值

若映射成功则返回映射区的内存起始地址, 否则返回MAP_FAILED(-1), 错误原因存于errno 中.

错误代码

EBADF 参数fd 不是有效的文件描述词

EACCES 存取权限有误. 如果是 MAP_PRIVATE 情况下文件必须可读

解除内存映射

头文件

#include <unistd.h>
#include <sys/mman.h>

函数原型

int munmap(void *start, size_t length);

函数说明

munmap()用来取消参数start所指的映射内存起始地址, 参数length则是欲取消的内存大小. 当进程结束或利用exec相关函数来执行其他程序时, 映射内存会自动解除, 但关闭对应的文件描述词时不会解除映射.

返回值

如果解除映射成功则返回0, 否则返回-1, 错误原因存于errno中错误代码EINVAL

参数 start或length 不合法.

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值