C/C++中内存操作函数

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'自动确定比较的长度,而不需要显式指定比较的字节数。