内存操作函数在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> // 用于 memcpy
int 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 数组复制到 dest
memcpy(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;
}