以下的知识来源于网络,如有侵权,请联系我删除哈
内容介绍:
1、malloc函数
2、calloc函数
3、realloc函数
4、free函数
5、bzero函数
6、memset函数
7、memcpy函数
8、memcmp函数
9、sprintf函数
内容详细介绍:
1、malloc函数
malloc函数 | 功能:去堆区申请size个字节 |
---|---|
相关函数 | calloc, free, realloc, brk |
头文件 | #include<stdlib.h> |
函数定义 | void * malloc (size_t size) |
函数说明 | malloc() 用来申请一段内存空间,大小为size个字节 |
返回值 | 申请成功,返回申请到的内存空间的起始地址;申请失败,返回NULL |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = malloc(4); //申请4个字节 memset(p, 'a',4); for (size_t i = 0; i < 4; i++) { printf("%d\n", *(p+i)); } return 0; }
执行结果:
2、calloc函数
calloc函数 | 功能:去堆区申请 (nmemb*size) 个字节 |
---|---|
相关函数 | malloc, free, realloc, brk |
头文件 | #include<stdlib.h> |
函数定义 | void calloc (size_t nmemb, size_t size) |
函数说明 | calloc() 用来配置nmemb个相邻的内存单元,每个单元的大小为size,并且返回指向这块内存的起始地址。这和使用malloc(nmemb*size)的效果相同,只不过使用calloc()申请的内存已经初始化为0了 |
返回值 | 申请成功返回内存的起始地址,申请失败返回NULL |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { //等价于malloc(4); char *p = calloc(1, 4); //申请4个字节 for (size_t i = 0; i < 4; i++) { printf("%d\n", *(p+i)); } printf("------------------------------\n"); memset(p, 'a',4); //先给申请的空间赋值 for (size_t i = 0; i < 4; i++) { printf("%d\n", *(p+i)); } return 0; }
执行结果:
3、realloc函数
realloc函数 | 功能:重新申请size个字节大小的堆内存 |
---|---|
相关函数 | malloc, free, calloc, realloc |
头文件 | #include<stdlib.h> |
函数定义 | void * realloc (void *ptr, size_t size) |
函数说明 | realloc() 把ptr所指向的内存块大小拓展到size个字节,如果size的大小大于原来内存块的大小,原来内存块的内容保持不变,增加的内存不会被初始化;如果ptr == NULL且size != 0,就等价于调用malloc(size); 如果size = 0且ptr != NULL,就等价于调用free(ptr) ; (注意:如果增加的内存空间比较小,系统可能会在原来内存块的后面拓展;如果增加的内存空间比较大,系统就会另外开辟内存来存储了,同时参数ptr在内部会被释放掉,所以在外部不需要重复释放) |
返回值 |
代码演示:
第1种情况:直接在原来内存块的后面拓展
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = calloc(1, 4); memset(p,'a',4); for (size_t i = 0; i < 4; i++) { printf("p[%ld]: %c\n", i, p[i]); } printf("char *p: %p\n", p); printf("------------------------\n"); char * p2 = realloc(p, 10); //重新申请大小 for (size_t i = 0; i < 10; i++) { printf("p2[%ld]:%c ", i, p2[i]); } printf("\n--------------------\n"); printf("char *p2: %p\n", p2); printf("--------------------\n"); return 0; }
执行结果:
第2种情况:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = calloc(1, 4); memset(p,'a',4); for (size_t i = 0; i < 4; i++) { printf("p[%ld]: %c\n", i, p[i]); } printf("char *p: %p\n", p); printf("------------------------\n"); char * p2 = realloc(p, 50); //重新申请大小 for (size_t i = 0; i < 50; i++) { printf("p2[%ld]:%c ", i, p2[i]); } printf("\n--------------------\n"); printf("char *p2: %p\n", p2); printf("--------------------\n"); return 0; }
4、free函数
free函数 | 功能:释放原先申请内存空间 |
---|---|
相关函数 | malloc, calloc, realloc,brk |
头文件 | #include<stdlib.h> |
函数定义 | void free (void * ptr) |
函数说明 | 参数ptr为指向先前由malloc, calloc, realloc所返回的的内存指针,调用free()后ptr所指向的内存空间便会被收回,假若参数ptr所指向的内存空间已经被收回或者是位置内存地址,则调用free()可能会出现无法预期的情况发生;如参数ptr为NULL,则free()不会有任何的效果哈(注意:指向某块内存的指针ptr,被调用free()释放掉后,需要把ptr设置为NULL, 如果重复释放,可能会出现无法预期的情况发生) |
返回值 | 无 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = calloc(1,4); memset(p, 'a', 4); for (size_t i = 0; i < 4; i++) { printf("p[%ld]:%c\n", i, p[i]); } printf("----------------\n"); free(p); //释放后再访问已经是非法访问了,这里仅仅是演示,释放后的内存空间的变化 //c语言的机制对释放的空间并不会清零,我这输出0,是系统的原因,正常情况下是不做任何处理的哈 for (size_t i = 0; i < 4; i++) { printf("p[%ld]:%c\n", i, p[i]); } return 0; }
执行结果:
5、bzero函数
bzero函数 | 功能:把一段内存内容全清为0 |
---|---|
相关函数 | memset, swab |
头文件 | #include<string.h> |
函数定义 | void bzero (void *, int n) |
函数说明 | bzero() 会将参数s所指向的内存区域前n个字节,全部设置为0,相当于调用memset ((void *)s, 0, size_t n) ,建议使用menset来代替 |
返回值 | 无 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = malloc(4); //申请4个字节 memset(p, 'a',4); //先给申请的空间赋值,然后再调用bzero函数来清空内存 for (size_t i = 0; i < 4; i++) { printf("%d ", *(p+i)); } printf("\n-------------------------\n"); bzero(p, 4); for (size_t i = 0; i < 4; i++) { printf("%d", *(p+i)); } return 0; }
执行结果:
6、memset函数
memset函数 | 功能:将一段内存填充为c值 |
---|---|
相关函数 | bzero, swab |
头文件 | #include<string.h> |
函数定义 | void * memset (void *s , int c, size_t n) |
函数说明 | memset() 会将参数s所指向的内存区域前n个字节以参数填入,然后返回指向s的指针,在编写程序时,若需要初始化某一数组,调用memset()会相当方便哈(注意:参数c虽然声明为int类型,但是必须为unsigned char 哈,所以范围在0-255之间哈) |
返回值 | 返回指向s的指针 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p = calloc(1,4); memset(p, 'A', 4); for (size_t i = 0; i < 4; i++) { printf("p[%ld]:%c\n", i, p[i]); } return 0; }
执行结果:
7、memcpy函数
memcpy函数 | 功能:内存拷贝 |
---|---|
相关函数 | bcopy, memcpy, memccpy, memmove, strcpy, strncpy |
头文件 | #include<string.h> |
函数定义 | void * memcpy (void * dest, const void *src, size_t n) |
函数说明 | memcpy() 用来拷贝src所指向的内存空间的前n个字节到dest所指向的内存地址上。与strcpy() 不同的是,memcpy() 会完整地复制n个字节,不会因为遇到字符串结束符’\n’而结束哈 (注意:指针src和dest所指向的内存区域不可重叠overlap) |
返回值 | 返回指向dest的指针 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char a[30] = "string (a)"; char b[30] = "string\0string"; strcpy(a, b); for (size_t i = 0; i < 30; i++) { printf("%c\n", a[i]); } printf("\n--------------------\n"); memcpy(a, b, 30); for (size_t i = 0; i < 30; i++) { printf("%c\n", a[i]); } return 0; }
执行结果:
8、memcmp函数
memcmp函数 | 功能:内存内容比较 |
---|---|
相关函数 | bcmp, strcasecmp, strcmp. strcoll, strncmp, strncasecmp |
头文件 | #include<string.h> |
函数定义 | int memcmp (const void *s1, const void *s2) |
函数说明 | memcmp() 用来比较s1和s2所指向的内存区间前n个字符,字符串大小的比较是以ASCII码表上的顺序来决定,次顺序亦为字符的值;memcmp() 首先将S1de 第一个字符减去s2的第一个字符的值,若差值为0,则继续比较下一个字符,如果差值不为0,则将差值返回。例如,字符串“Ac" 和"ba"比较 则返回字符’A‘(65)和’b‘(98)的差值(-33) |
返回值 | 若参数s1和s2所指向的内存内容都完全一样则返回0;若s1 > s2,返回大于0 的值;若s1 < s2,返回小于0 的值 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char *p1 = "asfd"; char *p2 = "asfd"; char *p3 = "zsd"; printf("%d\n", memcmp(p1, p2, 3)); printf("%d\n", memcmp(p1, p3, 3)); return 0; }
执行结果:
9、sprintf函数
sprintf函数 | 功能:格式化字符串拷贝 |
---|---|
相关函数 | printf, sprintf |
头文件 | #include<stdio.h> |
函数定义 | int sprintf (char *str, const char *format, …) |
函数说明 | sprintf() 会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指向的字符串数组,直到出现字符串结束(’\n‘)为止,关于参数format字符串的格式请参考printf()(注意:使用此函数得留意堆栈溢出,或者改用snprintf() 函数) |
返回值 | 成功则返回参数str字符串的长度,失败则返回-1,错误的原因存放于errno中 |
代码演示:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char const *argv[]) { char dest[50]; bzero(dest, 50); sprintf(dest,"%s","我是马保国"); printf("%s\n", dest); return 0; }
执行结果: