内存操作函数在C语言中是用来进行内存操作的一系列标准库函数,这些函数包含在<string.h>
头文件中。
1.复制内存区域
void *memcpy(void *dest, const void *src, size_t n);
- 功能:从源
src
的位置开始复制n
个字节到目标dest
的位置。 - 参数:
dest
:指向用于存储复制内容的目标数组的指针。src
:指向要复制的数据的源数组的指针。n
:要复制的字节数。
- 返回值:返回指向
dest
的指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> // 用于 malloc 和 free
#include <string.h> // 用于 memcpyint main() {int src[] = { 0, 4, 5, 6, 8, 9, 0 };int numberOfElements = sizeof(src) / sizeof(src[0]); // 计算 src 中的元素数量// 为 dest 分配内存。确保为所有元素分配足够空间。int* dest = (int*)malloc(sizeof(src));if (dest == NULL) {printf("内存分配失败\n");return 1; // 如果内存分配失败则退出}// 将整个 src 数组复制到 destmemcpy(dest, src, sizeof(src));// 使用 numberOfElements 控制循环for (int i = 0; i < numberOfElements; i++) {printf("%d ", dest[i]);}// 释放分配的内存以避免内存泄漏free(dest);return 0;
}
2.移动内存区域
void *memmove(void *dest, const void *src, size_t n);
- 功能:与
memcpy
相似,但是更安全,因为它在复制时考虑到了源和目标内存区域重叠的情况。 - 参数:
dest
:指向用于存储复制内容的目标数组的指针。src
:指向要复制的数据的源数组的指针。n
:要复制的字节数。
- 返回值:返回指向
dest
的指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>int main() {char str[] = "hello world";// 演示不重叠情况下的复制printf("原始字符串: %s\n", str);memmove(str + 6, str + 0, 5); // 将 "hello" 复制到 "world" 前面printf("复制后字符串: %s\n", str);// 重置字符串strcpy(str, "hello world");// 演示重叠情况下的复制printf("原始字符串: %s\n", str);memmove(str + 4, str + 3, 8); // 将 "lo world" 复制到 "o world" 位置printf("复制后字符串: %s\n", str);return 0;
}
3.设置内存区域
void *memset(void *s, int c, size_t n);
- 功能:将
s
指向的内存区域的前n
个字节设置为字节c
的值。 - 参数:
s
:指向要填充的内存块的指针。c
:要设置的值,传递的值是int
,但是函数内部会将其转换为unsigned char
。n
:要设置的字节数。
- 返回值:返回指向
s
的指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>int main() {char str[50];memset(str, 'a', 10);str[10] = '\0'; // 添加字符串结束符printf("%s\n", str);return 0;
}
4.比较内存区域
int memcmp(const void *s1, const void *s2, size_t n);
- 功能:比较
s1
和s2
指向的内存区域的前n
个字节。 - 参数:
s1
:指向要比较的第一个内存块的指针。s2
:指向要比较的第二个内存块的指针。n
:要比较的字节数。
- 返回值:如果第一个不匹配的字节在
s1
小于s2
时返回负数,如果s1
大于s2
时返回正数,如果两个内存块相等则返回0。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>int main() {char buffer1[] = "DWgaOtP12df0";char buffer2[] = "DWGAOTP12DF0";int n = memcmp(buffer1, buffer2, sizeof(buffer1));if (n > 0) printf("buffer1 大于 buffer2\n");else if (n < 0) printf("buffer2 大于 buffer1\n");else printf("buffer1 等于 buffer2\n");return 0;
}
5.搜索内存区域
void *memchr(const void *s, int c, size_t n);
- 功能:在
s
指向的内存区域的前n
个字节中搜索第一次出现的字节c
的值。 - 参数:
s
:指向要被搜索的内存块的指针。c
:要搜索的值。n
:要搜索的字节数。
- 返回值:如果找到指定的字节,则返回指向该字节的指针;如果在给定的字节数内没有找到指定的字节,则返回
NULL
。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>int main() {const char* str = "Hello, World!";const char ch = ',';char* ret;ret = memchr(str, ch, strlen(str));printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);return 0;
}