1. memcpy的模拟实现
void * memcpy ( void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
/*
* copy from lower addresses to higher addresses
*/
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
上面这段代码的意思是:设置两个参数为空指针和字节数的函数,函数内部由assert函数确保两个指针参数不是空指针,接下来是一个while循环,实现了src有效地址的所有字节赋给dst,以实现数组内容的拷贝
2.memmove 的模拟实现
void* My_memmove(void* des, const void* src, size_t count)
{
assert(des && src);
void* ret = des;
if (des < src)
{
while (count--)
{
*(char*)des = *(char*)src;
des = (char*)des + 1;
src = (char*)src + 1;
}
}
else
{
while (count--)
{
*((char*)des + count)= *((char*)src + count);
}
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
My_memmove(arr + 2, arr, 20);
for (int i = 0; i < 10; i++)
{
printf("%d ",arr[i]);
}
return 0;
}
memmove可以用来处理一个数组内的拷贝,和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 • 如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
3.⼤⼩端字节序和字节序判断
1. 什么是⼤⼩端?
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念: ⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。 ⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。 上述概念需要记住,⽅便分辨⼤⼩端。
大小端之分只是元素内部在内存上的存储布局,当需要取出数据时,取出的数据不会变且顺序相同,如取地址无论大小端都是取出的最小字节端的地址。