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()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内存的读写。
参数说明:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
返回值:若映射成功则返回映射区的内存起始地址,否则返回MAP_FAILED(-1),错误原因存于errno 中。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
-
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()不初始化,里面的数据是未知的垃圾数据。