【C语言】c语言内存函数及大小端字节序

本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充字节,memcmp进行内存比较。同时讨论了大小端字节序的概念。
摘要由CSDN通过智能技术生成


在这里插入图片描述

c语言内存函数

memcpy函数

定义格式

memcpy函数的定义格式就是如下:
在这里插入图片描述

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函数的定义格式就是如下:

在这里插入图片描述

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函数的定义格式就是如下:
在这里插入图片描述

void* memset(void* dest, int c, size_t count);

这个函数的功能就是dest中count字节的内容设置为想要的数c.

memcmp函数

定义格式

memcmp函数的定义格式就是如下:
在这里插入图片描述

int memcmp(const void* buf1, const void* buf2, size_t count);

内存比较函数功能就是从buf1和buf2指针指向的位置开始比较count个字节。

buf1小返回小于0的数,buf2大返回大于0的数,如果比较到最后都没有比较出来返回0。

大小端字节序

乍一听以为是什么很了不起的东西,其实就是数据以二进制存储进内存到底是从高地址处先存还是低地址先存。

大小端字节序的区别

大小端字节序的区别如下:

  • 大端存储:高地址存低地址数据,低地址存高地址数据。
  • 小端存储:高地址存高地址数据,低地址存低地址数据。

在这里插入图片描述表现在图中就是这样。那我们就可以编写程序判断当前环境是什么字节序。

#include<stdio.h>
int judge_system()
{
	int a = 1;
	return *((char*)&a);
}
int main()
{
	printf("%d ", judge_system() );
	return 0;
}

根据存储不同取出来第一个字节如果是小端就会返回1,大端返回0。

  • 113
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 100
    评论
评论 100
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值