memcpy函数源码
void *memcpy(void *dest,void *src, unsigned int count)
{
if (dest == src)
return src;
char* d = (char*)dest;
char* s = (char*)src;
while(count-- > 0)
*d++ = *s++;
return dest;
}
使用泛型指针交换任何类型数据
int swapData(void *x, void *y, int size) {
void *tmp;
if ((tmp = malloc(size)) == NULL) {
return -1;
}
//memcpy(void *__dst, const void *__src, size_t __n)
//memcpy功能:由src所指内存区域复制n个字节到dst所指内存区域
//⚠️src和dst所指内存区域不能重叠,函数返回指向dst的指针
/*
//以下示例返回数据a='\0', b='a',因为在操作memcpy(x, y, size)时,由于两个数据均为1个字节并且在内存中一般是
//连续的,但是分配了2个字节,导致src和dst内存区域重叠了,如果在a和b之间加一个数据string str = "abcde",
//输出就正常了,因为给a、b各分配2个字节就不会重叠了;正常情况应该使用swapData(&a, &b, 1);
//size应该为待交换数据的大小,而不能随意指定
char a = 'a';
char b = 'b';
swapData(&a, &b, 2);
*/
memcpy(tmp, x, size);
memcpy(x, y, size);
memcpy(y, tmp, size);
free(tmp);
return 0;
}
main函数部分
int main(int argc, const char * argv[]) {
char a = 'a';
//string str("abcde");
char b = 'b';
cout << a << " " << b << endl;
//输出结果:a b \r\n b a
//swapData(&a, &b, 1);
//输出结果:a b \r\n \0(或者其它未知数据) a
swapData(&a, &b, 2);
cout << a << " " << b << endl;
return 0;
}
swapData(&a, &b, 2)的输出结果异常分析:
关键在于函数memcpy
中的参数src和dst所指内存区域不能重叠
当传入的size和数据大小不一致时,会发生意想不到的情况