【C语言】(18)内存操作函数

26 阅读3分钟

内存操作函数在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);

  • 功能:比较s1s2指向的内存区域的前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;
}