【C语言】c语言内存函数及大小端字节序
CSDN 2024-07-07 08:35:08 阅读 68
目录
c语言内存函数memcpy函数定义格式与字符串拷贝strcpy函数区别模拟实现缺点
memmove函数定义格式模拟实现
memset函数memcmp函数定义格式
大小端字节序大小端字节序的区别
c语言内存函数
memcpy函数
定义格式
memcpy函数的定义格式就是如下:
<code>void* memcpy(void* dest, const void* src, size_t count);
使用时必须包含头文件<memory.h>或者<string.h>。
函数参数列表中src 顾名思义就是源头从src中复制count个字节的数据到dest中。
与字符串拷贝strcpy函数区别
主要有以下两点不同:
这个函数与字符串拷贝strcpy函数除了void*
可以包含任意类型以外。
这个函数遇到’\0’并不会结束,它一定会拷贝count个字节数据。接下来根据描述模拟实现一下。
模拟实现
对 memcpy函数模拟实现代码如下:
void* my_memcpy(void* dest, const void* src, size_t count)
{
assert(dest && src);
void* ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
缺点
根据这个实现我们可以看出如果src和dest有任何重叠区域,复制的结果都是未定义的。
那如何解决这个问题就有请下一个函数memmove出场。
memmove函数
定义格式
memmove函数的定义格式就是如下:
<code>void* memmove(void* dest, const void* src, size_t count);
使用必须包含头文件<string.h>。
其中参数与memcpy一样,参数列表中src 顾名思义就是源头从src中复制count个字节的数据到dest中。
但是它可以处理src和dest内存重叠的情况。接下来模拟实现一下。
模拟实现
对 memmove函数模拟实现代码如下:
void* my_memmove(void* dest, const void* src, size_t count)
{
void* ret = dest;
if ((char*)dest > (char*)src)
{
(char*)src = (char*)src + (count - 1);
(char*)dest = (char*)dest + (count - 1);
while (count--)
{
*(char*)dest = *(char*)src;
(char*)dest = (char*)dest - 1;
(char*)src = (char*)src - 1;
}
}
else
{
while (count--)
{
*(char*)dest = *(char*)src;
(char*)dest = (char*)dest + 1;
(char*)src = (char*)src + 1;
}
}
return ret;
}
可以看出memmove好像将memcpy包括了,memcpy可以处理的memmove都可以处理。
memset函数
memset函数的定义格式就是如下:
<code>void* memset(void* dest, int c, size_t count);
这个函数的功能就是dest中count字节的内容设置为想要的数c.
memcmp函数
定义格式
memcmp函数的定义格式就是如下:
<code>int memcmp(const void* buf1, const void* buf2, size_t count);
内存比较函数功能就是从buf1和buf2指针指向的位置开始比较count个字节。
buf1小返回小于0的数,buf2大返回大于0的数,如果比较到最后都没有比较出来返回0。
大小端字节序
乍一听以为是什么很了不起的东西,其实就是数据以二进制存储进内存到底是从高地址处先存还是低地址先存。
大小端字节序的区别
大小端字节序的区别如下:
大端存储:高地址存低地址数据,低地址存高地址数据。小端存储:高地址存高地址数据,低地址存低地址数据。
表现在图中就是这样。那我们就可以编写程序判断当前环境是什么字节序。
<code>#include<stdio.h>
int judge_system()
{
int a = 1;
return *((char*)&a);
}
int main()
{
printf("%d ", judge_system() );
return 0;
}
根据存储不同取出来第一个字节如果是小端就会返回1,大端返回0。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。