C内存管理函数

来源:互联网 发布:网络彩票何时恢复 编辑:程序博客网 时间:2024/05/21 10:24

1. malloc 分配一段内存空间

定义函数:void *malloc(size_t size);
函数说明:malloc()用来配置内存空间, 其大小由指定的size 决定.
返回值:若配置成功则返回一指针, 失败则返回NULL.

2. calloc

定义函数:void *calloc(size_t nmemb, size_t size);
函数说明:calloc()用来配置nmemb个相邻的内存单位, 每一单位的大小为size, 并返回指向第一个元素的指针.这和使用下列的方式效果相同:malloc(nmemb*size);不过, 在利用calloc()配置内存时会将内存内容初始化为0.
返回值:若配置成功则返回一指针, 失败则返回NULL.

3. free

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

4. memset 内存填入函数

定义函数:void * memset(void *s, int c, size_t n);
函数说明:memset()会将参数s 所指的内存区域前n 个字节以参数c 填入, 然后返回指向s 的指针. 在编写程序时, 若需要将某一数组作初始化, memset()会相当方便.
返回值:返回指向s 的指针.
附加说明:参数 c 虽声明为int, 但必须是unsigned char, 所以范围在0 到255 之间.

5. memcpy 内存复制函数

定义函数:void * memcpy (void * dest, const void *src, size_t n);
函数说明:memcpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的内存地址上. 与strcpy()不同的是, memcpy()会完整的复制n 个字节, 不会因为遇到字符串结束'\0'而结束.
返回值:返回指向dest 的指针.
附加说明:指针 src 和dest 所指的内存区域不可重叠.

6. memmove 内存复制函数

定义函数:void * memmove(void *dest, const void *src, size_t n);
函数说明:memmove()与memcpy()一样都是用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上. 不同的是, 当src 和dest 所指的内存区域重叠时, memmove()仍然可以正确的处理, 不过执行效率上会比使用memcpy()略慢些.
返回值:返回指向dest 的指针.

7. memcmp 内存比较函数

定义函数:int memcmp (const void *s1, const void *s2, size_t n);
函数说明:
memcmp()用来比较s1 和s2 所指的内存区间前n 个字符. 字符串大小的比较是以ASCII 码表上的顺序来决定, 次顺序亦为字符的值. memcmp()首先将s1 第一个字符值减去s2 第一个字符的值, 若差为0 则再继续比较下个字符, 若差值不为0 则将差值返回. 例如, 字符串"Ac"和"ba"比较则会返回字符'A'(65)和'b'(98)的差值(-33).
返回值:若参数s1 和s2 所指的内存内容都完全相同则返回0 值. s1 若大于s2 则返回大于0 的值. s1 若小于s2 则返回小于0 的值.

8. memchr 在内存中查找特定字符

定义函数:void * memchr(const void *s, int c, size_t n);
函数说明:memchr()从头开始搜寻s 所指的内存内容前n 个字节, 直到发现第一个值为c 的字节, 则返回指向该字节的指针.
返回值:如果找到指定的字节则返回该字节的指针, 否则返回0.

9. memccpy 复制内存中的内容

定义函数:void * memccpy(void *dest, const void * src, int c, size_t n);
函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上. 与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现, 若是则返回dest 中值为c 的下一个字节地址.
返回值:返回指向dest 中值为c 的下一个字节指针. 返回值为0 表示在src 所指内存前n 个字节中没有值为c的字节.

10. mmap

定义函数:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
函数说明:
mmap()用来将某个文件内容映射到内存中, 对该内存区域的存取即是直接对该文件内容的读写.
(1)参数start 指向欲对应的内存起始地址, 通常设为NULL, 代表让系统自动选定地址, 对应成功后该地址会返回.
(2)参数length 代表将文件中多大的部分对应到内存.
(3)参数 prot 代表映射区域的保护方式有下列组合
    PROT_EXEC 映射区域可被执行
    PROT_READ 映射区域可被读取
    PROT_WRITE 映射区域可被写入
    PROT_NONE 映射区域不能存取
(4)参数 flags 会影响映射区域的各种特性
    MAP_FIXED 如果参数 start 所指的地址无法成功建立映射时, 则放弃映射, 不对地址做修正.通常不鼓励用此旗标.
    MAP_SHARED 对应射区域的写入数据会复制回文件内, 而且允许其他映射该文件的进程共享.
    MAP_PRIVATE 对应射区域的写入操作会产生一个映射文件的复制, 即私人的"写入时复制" (copy
    on write)对此区域作的任何修改都不会写回原来的文件内容.
    MAP_ANONYMOUS 建立匿名映射. 此时会忽略参数fd, 不涉及文件, 而且映射区域无法和其他进程共享.
    MAP_DENYWRITE 只允许对应射区域的写入操作, 其他对文件直接写入的操作将会被拒绝.
    MAP_LOCKED 将映射区域锁定住, 这表示该区域不会被置换(swap).
    注:在调用mmap()时必须要指定MAP_SHARED 或MAP_PRIVATE.
(5)参数fd 为open()返回的文件描述词,代表欲映射到内存的文件.
(6)参数offset为文件映射的偏移量, 通常设置为0, 代表从文件最前方开始对应, offset必须是分页大小的整数倍.
返回值:若映射成功则返回映射区的内存起始地址, 否则返回MAP_FAILED(-1), 错误原因存于errno 中.
错误代码:
EBADF 参数fd 不是有效的文件描述词
EACCES 存取权限有误. 如果是MAP_PRIVATE 情况下文件必须可读, 使用MAP_SHARED 则要有
PROT_WRITE 以及该文件要能写入.
EINVAL 参数start、length 或offset 有一个不合法.
EAGAIN 文件被锁住, 或是有太多内存被锁住.
ENOMEM 内存不足.

11. munmap

定义函数:int munmap(void *start, size_t length);
函数说明:munmap()用来取消参数start 所指的映射内存起始地址, 参数length 则是欲取消的内存大小. 当进程结束或利用exec 相关函数来执行其他程序时, 映射内存会自动解除, 但关闭对应的文件描述词时不会解除映射.
返回值:如果解除映射成功则返回0, 否则返回-1, 错误原因存于errno 中错误代码EINVAL参数 start 或length 不合法.