💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # memset ~~~ #include <string.h> void * memset(void *s, int c, size_t n); ~~~ 功能:将s的内存区域的前n个字节以参数c填入 参数 * s: 需要操作内存s的首地址 * c: 填充字符,c虽然参数为int,但必须是unsigned char,范围为0-255 * n: 指定需要设置的大小 返回值: s的首地址 ~~~ int main() { //创建堆空间 int * p = (int *)malloc(sizeof(int) * 10); //初始化 //参数: 目标 值 字节大小 memset(p, 0, 40); for (int i = 0; i < 10; ++i) { printf("%d\n", p[i]); } free(p); getchar(); return EXIT_SUCCESS; } ~~~ 输出全是0 如果是1的话 ~~~ int main() { //创建堆空间 int * p = (int *)malloc(sizeof(int) * 10); //初始化 //参数: 目标 值 字节大小 memset(p, 1, 40); for (int i = 0; i < 10; ++i) { printf("%d\n", p[i]); } free(p); getchar(); return EXIT_SUCCESS; } ~~~ 输出全是16843009 因为int是4个字节,内存16字节表示`00 00 00 00` 1的话是`01 01 01 01` 这个16进制转为10进制就是16843009 # memcpy ~~~ #include <string.h> void * memcpy(void * dest, const void * src, size_t n) ~~~ 功能: 拷贝src所指的内存内容的前n个字节到dest所值的内存地址上 参数: * dest: 目的内存首地址 * src: 源内存首地址,注意: **dest和src所指的内存空间不可重叠** * n: 需要拷贝的字节数 返回值: dest的首地址 ~~~ int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //创建堆空间 int * p = (int *)malloc(sizeof(int) * 10); memcpy(p, arr, 40); for (int i = 0; i < 10; ++i) { printf("%d\n", p[i]); } free(p); getchar(); return EXIT_SUCCESS; } ~~~ 数组内部的copy ~~~ int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; memcpy(&arr[2], arr, 20); for (int i = 0; i < 10; ++i) { printf("%d\n", arr[i]); } getchar(); return EXIT_SUCCESS; } ~~~ # memmove memmove()功能用法和memcpy()一样,区别在于: dest和src所指的内存空间重叠时,memmove()仍然能处理,不过执行效率比memcpy低些 ~~~ int main() { int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; memmove(&arr[2], arr, 20); for (int i = 0; i < 10; ++i) { printf("%d\n", arr[i]); } getchar(); return EXIT_SUCCESS; } ~~~ # memcmp ~~~ #include <string.h> int memcmp(const void *s1, const void *s2, size_t n); ~~~ 功能: 比较s1和s2所指向内存区域的前n个字节 参数: * s1: 内存首地址1 * s2: 内存首地址2 * n: 需比较的前n个字节 返回值: * 相等=0 * 大于>0 * 小于<0 ~~~ int main() { int arr1[10] = {1, 2, 3, 4, 5, 6, 7, 8}; int arr2[5] = {1, 2, 3, 4, 5}; int val = memcmp(arr1, arr2, 20); if (!memcmp(arr1, arr2, 8)) { printf("前2个数组元素内容相同\n"); } printf("%d\n", val); getchar(); return EXIT_SUCCESS; } ~~~ # calloc 堆分配内存API ~~~ #include <stdlib.h> void *calloc(10, sizeof(int)); 功能: 在内存动态存储区中分配nmemb块长度为size字节的连续区域.calloc自动将分配的内存置0 参数: nmemb: 所需内存单元数量 size: 每个内存单元的大小(单位:字节) 返回值: 成功: 分配空间的起始地址 失败: NULL ~~~ # realloc ~~~ #include <stdlib.h> void *realloc(void *ptr, size_t size); 功能: 重新分配用malloc或者calloc函数在堆中分配内存空间的大小 realloc不会自动清理增加的内存,需要手动清理,如果指定的地址后面有连续的空间,那么就会在已有地址基础上增加内存,如果指定的地址后面没有空间,那么realloc会重新分配新的连续内存,把旧内存的值拷贝到新内存,同时释放旧内存 参数: ptr: 为之前用malloc或者calloc分配的内存地址,如果此参数等于NULL,那么和realloc与malloc功能一致 size: 为重新分配内存的大小,单位:字节 返回值: 成功: 新分配的堆内存地址 失败: NULL ~~~