您的位置:首页 > 编程语言 > C语言/C++

C语言内存管理函数

2016-06-04 11:26 330 查看

C语言内存管理函数

memset函数

void *memset(void *ptr, int val, size_t num);

函数作用:用来将制定指定的前n个字节设置为特定的值。

参数说明:

ptr为要操作的内存的函数。

value为要设置的值。既可以向value传递int类型的值,也可以传递char类型的值,int和char可以根据ASCII码相互转换。

num为ptr的前num个字节,size_t是unsigned int。

函数说明:memset()会将ptr所指的内存区域的前num个字节的值都设置为value,然后返回指向ptr的指针。常用来初始化字符数组。

memmove函数

void *memmove(void *dest, const void *src, size_t num);

函数说明:memmove()与memcpy()类似,都是用来复制src所指的内存内容前num个字节到dest所指的地址上。不同的是,memmove()更为灵活,当src和dest所指的内存区域重叠时,memmove()仍然可以正确处理,不过执行效率上会比使用memcpy()略慢些。

memcpy函数

void *memcpy(void *dest, const void *src, size_t num);

函数说明:memcpy()会复制src所指的内存内容的前num个字节到dest所指的内存地址上。memcpy()不关心被复制的数据类型,知识逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。

注意:1)dest指针要分配足够的空间,也即大于等于num字节的空间。如果没有分配空间,会出现段错误;2)dest和src所指的内存空间不能重叠(如果发生了重叠,使用memmove()会更加安全);3)与strcpy()不同,memcpy()会完整的复制num个字节,不会因为遇到’\0’而结束。

memcmp函数

int memcmp(const void *s1, const void *s2, size_t n);

函数说明:memcmp()用来比较s1和s2所指的内存区间前n个字符。字符串大小的比较时以ASCII码表上的顺序来决定,次顺序亦为字符的值。memcmp()首先将s1第一个字符值减去s2第一个字符值,若差为0则再继续比较下个字符,若差值不为0,则将差值返回。

返回值:若参数s1和s2所指的内存内容完全相同,则返回0值。若s1大于s2则返回大于0的值。若s1小于s2则返回小于0的值。

memchr函数

void *memchr(const void *s, char c, size_t n);

函数说明:memchr()从头开始搜索s所指的内存内容前n个字节,直到发现第一个值为c的字节,则返回指向该字节的指针。

返回值:如果找到指定的字节则返回该字节的指针,否则返回0。

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的字节。

bzero函数

void bzero(void *s, int n);

函数说明:bzero()用来讲参数s所指的内存区域前n个字节全部设为零值。参数s为内存(字符串)指针,n为需要清零的字节数。实际上,bzero(void s, int n)等价于memset((void )s, 0, size_t n),用来将内存块的前n个字节清零,但是s参数为指针,又很奇怪的位于string.h文件中,也可以用来清零字符串。

注意:bzero()不是标准函数,没有再ANSI中定义,建议使用memset函数。

bcopy函数

void bcopy(const void *src, void *dest, int n);

函数说明:bcopy()与memcpy()一样都是用来拷贝src所指的内存前n个字节到dest所指的地址,不过参数src和dest在传给函数时,是相反的位置。参数src为源内存块(字符串)指针,dest为目标内存块(字符串)指针,n为要复制的内存(字符串)的前n个字节长度。bcopy()不检查内存(字符串)中的空字节NULL。实际上,bcopy()和memcpy()功能相同,用来复制内存块的前n个字节,但是s1,s2两个参数为指针,故可以用来复制字符串。

bcmp函数

int bcmp(const void *s1, const void *s2, int n);

函数说明:bcmp()用来比较内存(字符串)的前n个字节是否相等,参数s1,s2为需要比较的两块内存(或两个字符串),n为要比较的长度。它不检查NULL。实际上,bcmp()与memcmp()功能相同,用来比较内存块的前n个字节是否相等,但是s1,s2两个参数为指针,也可以用来比较字符串。

返回值:如果s1,s2的前n个字节相等或者n等于0,则返回0,否则返回非0值。

munmap函数

int munmap(void *start, size_t length);

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

返回值:如果解除映射成功,则返回0,否则返回-1。错误原因存于errno中错误代码EINVAL参数start或length不合法。

mmap函数

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 情况下文件必须可读,使用MAP_SHARED 则要有PROT_WRITE 以及该文件要能写入。
EINVAL  参数start、length 或offset 有一个不合法。
EAGAIN  文件被锁住,或是有太多内存被锁住。
ENOMEM  内存不足。


malloc函数

void *malloc(size_t size);

函数说明:malloc()用来动态分配内存空间。它在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,可使用calloc()函数。参数size为需要分配的内存空间大小,以字节(Byte)计。

返回值:分配成功返回指向该内存的地址,失败则返回NULL。由于申请空间时可能有也可能没有,所以需要自行判断是否申请成功,再进行后续操作。如果size值为0,那么返回值会因标准库实现的不同而不同,可能是NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型是void *,void并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以使用malloc()时通常需要进行强制类型转换,将void指针转换成所希望的类型。

getpagesize函数

size_t getpagesize(void);

函数说明:getpagesize()返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。

返回值:内存分页大小。

free函数

void free(void *ptr);

函数说明:free()用来释放动态分配的内存空间。它可以释放由malloc(),calloc(),realloc()分配的内存空间,以便其他程序再次使用。参数ptr为将要释放的内存空间的地址。

注意:free()只能释放动态分配的内存空间,并不能释放任意内存。它不会改变ptr变量本身的值,调用free()后它仍然会指向相同的内存空间,但是此时该内存已无效,不能被使用。所以建议将ptr的值设置为NULL。

calloc函数

void *calloc(size_t num, size_t size);

函数说明:calloc()用来动态分配内存空间并初始化为0。它在内存中动态地分配num个长度为size的连续空间,并将每一个字节都初始化为0。所以它的结果是分配了num * size个字节长度的内存空间,并且每个字节的值都是0。

返回值:分配成功返回指向该内存的地址,失败则返回NULL。如果size值为0,则返回因标准库实现的不同而不同,可能是NULL,也可能不是,但返回的指针不应该再次被引用。

注意:函数的返回值类型为void *,void并不是说没有返回值或者返回空指针,而是返回的指针类型未知。所以在使用calloc()时通常需要进行强制类型转换,将void指针转换成所希望的类型。calloc()与malloc()重要区别是calloc()在动态分配内存后,自动初始化该内存空间为零,而malloc()不初始化,里面的数据是未知的垃圾数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息