目录
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