C/C++中常见的内存操作函数有:memset()、memcpy()、memmove()和memcmp()。
memset()
memset 是 C 语言标准库 “string.h” 中提供的一个函数,用于将一块内存区域填充为指定的值。
memset 函数的原型如下:
void *memset(void *ptr, int value, size_t num);
参数说明:
ptr:指向要填充的内存区域的指针。value:要填充的值,以整数形式传递。num:要填充的字节数。memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。
以下是一个使用 memset 的示例:
#include "stdio.h"
#include "string.h"
int main()
{
char str[15];
// 填充 str 数组的前 15 个字节为字符 'A'
memset(str, 'A', 15);
printf("str 内容为:%s\n", str);
return 0;
}
在上述示例中,我们定义了一个 char 类型的数组 str,长度为 15。使用 memset 函数将数组的前 15 个字节设置为字符 ‘A’。最后使用 printf 函数打印数组内容。
运行程序后的输出结果如下所示:
str 内容为:AAAAAAAAAAAAAAA
需要注意的是,memset 函数逐字节设置指定内存区域,适用于字符类型 (char) 或无符号字节类型 (unsigned char) 的数据。对于其他数据类型,如整数或自定义结构体,如果需要设置为其他具体的值,可以使用其他方法,如循环逐个赋值。此外,在使用 memset 时需要确保目标内存区域的大小不超过其分配的大小,以避免访问越界。
memcpy()
memcpy 是 C 语言标准库 <string.h> 中提供的一个函数,用于将源内存区域的内容复制到目标内存区域。
memcpy 函数的原型如下:
void *memcpy(void *dest, const void *src, size_t n);
参数说明:
dest:指向目标内存区域的指针,也就是要将源数据复制到的地方。src:指向源内存区域的指针,也就是要复制的数据来源。n:要复制的字节数。memcpy 函数会将源内存区域 src 的前 n 个字节的内容复制到目标内存区域 dest 中。
以下是一个使用 memcpy 的示例:
#include "stdio.h"
#include "string.h"
int main()
{
char src[] = "Hello, Dabing!";
char dest[20];
// 将 src 数组的内容复制到 dest 数组
memcpy(dest, src, strlen(src) + 1);
printf("dest 内容为:%s\n", dest);
return 0;
}
在上述示例中,我们定义了一个 src 数组,内容为 “Hello, Dabing!”,然后定义了一个 dest 数组作为目标。使用 memcpy 函数将 src 数组的内容复制到 dest 数组中。最后使用 printf 打印 dest 数组的内容。
运行程序后的输出结果如下所示:
dest 内容为:Hello, Dabing!
需要注意的是,memcpy 函数逐字节复制源内存区域的内容到目标内存区域,适用于任意类型的数据。但需要确保目标内存区域的大小足够容纳源数据,以避免访问越界。同时,为了防止内存重叠导致不确定的结果,建议源内存区域和目标内存区域不能重叠。
memmove()
memmove 是 C 语言标准库 <string.h> 中提供的一个函数,用于在内存中移动一块数据。
memmove 函数的原型如下:
void *memmove(void *dest, const void *src, size_t n);
参数说明:
dest:指向目标内存区域的指针,也就是要将数据移动到的地方。src:指向源内存区域的指针,也就是要移动的数据来源。n:要移动的字节数。memmove 函数会将源内存区域 src 的内容移动到目标内存区域 dest 中,并且可以处理内存重叠的情况。
以下是一个使用 memmove 的示例:
#include "string.h"
int main()
{
char str[] = "Hello, Dabing!";
char buffer[20];
// 将 str 数组的内容移动到 buffer 数组
memmove(buffer, str, strlen(str) + 1);
printf("buffer 内容为:%s\n", buffer);
return 0;
}
在上述示例中,我们定义了一个 str 数组,内容为 “Hello, Dabing!”,然后定义了一个 buffer 数组作为目标。使用 memmove 函数将 str 数组的内容移动到 buffer 数组中。最后使用 printf 打印 buffer 数组的内容。运行程序后的输出结果如下所示:
buffer 内容为:Hello, Dabing!
需要注意的是,与 memcpy 不同的是,memmove 函数能够处理源内存区域和目标内存区域重叠的情况,以确保正确的数据移动。因此,当需要在内存中进行数据移动时,并且源内存区域和目标内存区域可能重叠时,建议使用 memmove 函数而不是 memcpy 函数。
memcmp()
memcmp 是 C 语言标准库 <string.h> 中提供的一个函数,用于比较两个内存区域的内容。
memcmp 函数的原型如下:
int memcmp(const void *ptr1, const void *ptr2, size_t num);
参数说明:
ptr1:指向第一个内存区域的指针。ptr2:指向第二个内存区域的指针。num:要比较的字节数。memcmp 函数会比较 ptr1 和 ptr2 指向的内存区域的前 num 个字节的内容,并根据比较结果返回一个整数值。返回值的含义如下:
如果 ptr1 的内容小于 ptr2 的内容,返回一个负整数。如果 ptr1 的内容等于 ptr2 的内容,返回 0。如果 ptr1 的内容大于 ptr2 的内容,返回一个正整数。
以下是一个使用 memcmp 的示例:
#include "string.h"
int main()
{
char str1[] = "Hello";
char str2[] = "World";
int result = memcmp(str1, str2, 5);
if (result < 0)
{
printf("str1 小于 str2\n");
}
else if (result == 0)
{
printf("str1 等于 str2\n");
}
else
{
printf("str1 大于 str2\n");
}
return 0;
}
在上述示例中,我们使用 memcmp 函数比较了两个字符串 str1 和 str2 的前 5 个字符。根据比较结果,使用条件语句判断并打印了相应的结果。
运行程序后的输出结果如下:
str1 小于 str2
需要注意的是,memcmp 函数是以字节为单位进行比较的,因此适用于比较任意类型的数据。但是,当比较字符串时,建议使用字符串比较函数 strcmp 来代替 memcmp,因为 strcmp 能够根据字符串的终止符'\0'自动确定比较的长度,而不需要显式指定比较的字节数。