C语言中的内存操作函数:memcpy、memcmp与memset

一、memcpy —— 内存拷贝

void * memcpy ( void * destination, const void * source, size_t num );

memcpy函数用于将源内存区域的内容复制到目标内存区域。功能是将从source指向的内存起始位置连续num个字节的数据,原样复制到destination指向的内存区域。

例如:

void* My_memcpy(void * dest, const void * src,size_t sz) {
    // ...
}

int main() {
    int arr1[20] = { 1,2,3,4,5,6,7,8,9,10 };
    My_memcpy(arr1+2,arr1,sizeof(arr1)); // 将arr1的前20个字节复制到arr1+2开始的位置

    // 复制后arr1内存情况:
    // | 1 | 2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... |
    
    // 打印数组内容
    for (int i = 0; i < 10; i++) {
        printf("%d ", arr1[i]);
    }
    return 0;
}

在上述自定义实现的My_memcpy函数中,根据目标和源地址的大小关系,分别采用了不同的复制策略,以防止在复制过程中对已复制的部分造成覆盖。

二、memcmp —— 内存比较

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

memcmp函数用于比较两个内存区域的前num个字节内容。功能是对ptr1ptr2所指内存的前num个字节进行逐个比较,返回值为负数、零或正数,表示ptr1区域小于、等于或大于ptr2区域。

例如:

int main() {
    int arr1[] = { 1,2,3,4,5,6,7,8 };
    int arr2[] = { 1,2,3,4,6,6,7,8 };
    int a = memcmp(arr1, arr2,20); // 比较arr1和arr2前20个字节(实际元素个数不足20)

    // 前四个字节相同,第五个字节arr1[4]=5,arr2[4]=6,因此a<0
    printf("%d ", a); // 输出负数

    return 0;
}

此处注意,虽然数组的实际元素个数不足20,但memcmp会继续比较数组之后的内存(可能未初始化),这可能导致不可预期的结果。

三、memset —— 内存设置

void * memset ( void * ptr, int value, size_t num );

memset函数用于将指定内存区域填充为特定的字符。功能是从ptr指向的内存地址开始,将接下来num个字节全部填充为整型变量value对应的ASCII字符(对于非字符类型,填充的是该类型的value)。

例如:

int main() {
    int arr[10] = { 0 };
    memset(arr,1,12); // 将arr数组的前12个字节(即前三个整数)填充为1(假设int为4字节)

    // 填充后arr内存情况(假设int为4字节):
    // | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |

    return 0;
}

这里需要注意,如果num不是目标类型长度的整数倍,那么最后一个对象可能会部分填充。例如上例中,由于num=12int为4字节,所以最后会有一个整数只填充了前三个字节,剩余一个字节保持原值。

你可能感兴趣的:(c语言,算法,开发语言)