【C】库函数之 memcpy

本文详细介绍了C/C++中的memcpy函数,包括其功能、参数及使用注意事项,并通过具体实例展示了如何实现自定义的memcpy函数以及如何进行内存块的复制。

目录

1. Copy block of memory

2. 源代码

3. 输出结果


1. Copy block of memory

#include <string.h>
void * memcpy ( void * destination, const void * source, size_t num );

Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.

The underlying type of the objects pointed to by both the source and destination pointers are irrelevant for this function; The result is a binary copy of the data.

The function does not check for any terminating null character in source - it always copies exactly num bytes.

To avoid overflows, the size of the arrays pointed to by both the destination and source parameters, shall be at least num bytes, and should not overlap (for overlapping memory blocks, memmove is a safer approach).

上述内容是 cplusplus 对 memcpy 函数的介绍。

可以看出 memcpy 函数从源 src 所指的内存地址的起始位置开始复制 count 个字节到目标 dest 所指的内存地址的起始位置中。

2. 源代码

#include <stdio.h>
#include <assert.h>

#define MAX_ARR 6

void *Memcpy(void *dest, const void *src, size_t count) {
	assert((NULL != src) && (NULL != dest));

	void *ret = dest;

	while (count--) {
#if 0
		*(char *)ret = *(char *)src;
		ret = (char *)ret + 1;
		src = (const char *)src + 1;
#endif
		*(char *)ret++ = *(char *)src++;
	}

	return dest;
}

void print_int_arr(int arr[], int len) {
    int i = 0;
   
    for (; i < len; ++i)
        printf("%-4d", arr[i]);
   
    putchar('\n');
}  
   
void test_str() {
    char str1[10] = "abc";
    char str2[] = "xyz";
   
    printf("call Memcpy before, str1: %s, str2: %s\n", str1, str2);
    //Memcpy(str1, str2, sizeof(str2));
    //printf("call Memcpy after, str1: %s, str2: %s\n", str1, str2);
    printf("call Memcpy after, str1: %s, str2: %s\n", (char *)Memcpy(str1, str2, sizeof(str2)), str2);
}  
   
void test_int_arr() {
    int i = 0;
    int b[MAX_ARR + 1] = {0};
    int a[MAX_ARR] = {0};
   
    for (i = 0; i < MAX_ARR + 1; ++i)
        b[i] = i + 10;
   
    puts("call Memcpy b array before:");
    print_int_arr(b, MAX_ARR + 1);
    puts("call Memcpy b array after:");
    Memcpy(b, a, sizeof(a));
    print_int_arr(b, MAX_ARR + 1);
}

int main(void) {
    test_str();
    test_int_arr();
 
    return 0;
}

3. 输出结果

call Memcpy before, str1: abc, str2: xyz
call Memcpy after, str1: xyz, str2: xyz
call Memcpy b array before:
10  11  12  13  14  15  16
call Memcpy b array after:
0   0   0   0   0   0   16

`memcpy` 是 C 标准库中的一个非常重要的函数,定义在 `<string.h>` 头文件中,其作用是将一段内存区域的内容复制到另一段内存区域。其函数原型如下: ```c void* memcpy(void* dest, const void* src, size_t n); ``` 它的功能是从 `src` 指向的内存地址复制 `n` 个字节到 `dest` 指向的内存地址中。 ### 实现原理 实现 `memcpy` 的关键在于逐字节地复制数据,通常使用指针操作来完成。需要注意的是,它不处理内存重叠的情况(如果需要处理重叠内存,请使用 `memmove`)。 下面是一个简化版本的 `memcpy` 实现: ```c #include <stddef.h> // for size_t void* my_memcpy(void* dest, const void* src, size_t n) { char* d = (char*)dest; const char* s = (const char*)src; while (n--) { *d++ = *s++; } return dest; } ``` ### 代码解释: 1. **类型转换为 `char*`:** - 因为内存复制是以字节为单位进行的,所以使用 `char*` 类型的指针最为合适(因为 `char` 的大小是 1 字节)。 - `dest` 和 `src` 被强制转换为 `char*` 类型,以便按字节访问。 2. **循环复制:** - 使用 `while(n--)` 控制复制的字节数。 - 每次循环复制一个字节:`*d++ = *s++`。 - 这个操作将源内存中的每个字节依次复制到目标内存中。 3. **返回值:** - 返回原始的 `dest` 指针,这是与标准 `memcpy` 函数一致的行为。 ### 示例使用: ```c #include <stdio.h> int main() { char src[] = "Hello, world!"; char dest[20]; my_memcpy(dest, src, 14); // 复制字符串内容 dest[14] = '\0'; // 手动添加字符串结束符 printf("Copied string: %s\n", dest); return 0; } ``` ### 注意事项: - 该实现没有处理内存重叠的情况。如果 `dest` 和 `src` 区域有重叠,应使用 `memmove`。 - 实际的 C 标准库实现通常会对齐内存地址并使用更高效的批量复制方式(例如使用 `long*` 或 SIMD 指令)来提高性能。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值