【C】库函数之 memcpy

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值