C语言中内存函数的示例分析

发布时间:2021-09-13 16:34:08 作者:小新
来源:亿速云 阅读:88

这篇文章将为大家详细讲解有关C语言中内存函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

内存函数

memcpy内存拷贝

原格式

C语言中内存函数的示例分析

分析

**字面上意思只要是内存里面的东西就都可以进行拷贝,所以就打破了字符串拷贝的魔咒,什么类型都可以进行拷贝,那就不需要想来,肯定回和万能类型(通用类型指针-无类型指针)void*有关,因为当时做qsort还是印象深刻的

/*num是几个字节的意思*/
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
	void* ret = dest;
	while (num--)
	{
		//和void*连用char*,分成最小然后一个一个传
		*(char*)dest = *(char*)src;
		((char*)dest)++;//void*无类型不好直接加加,就强转char*再加加
		((char*)src)++;
	}	
	return ret;
}
内存拷贝的问题

1.内存相关连的话,就会拷贝错误

C语言中内存函数的示例分析

那你怎么解决内存相关连还不会有上面的错误,正面赋值交集的内存空间会被操作两次,就会改变原来的值,那我们怎么做呢,如果从后面来呢,前面操作两次会把后面的变了,那就先把后面的拿走赋值,不就间接的改变了原来会变的情况了吗,所以这样上面的代码就得修改了,这是朝后面拷贝的情况,如果提目是朝前面拷贝的话,是不是从后面来就有问题了,反而从前面来会比较完美,所以我们得两种情况都得考虑到

所以为了解决重叠拷贝的问题就有了memmove这个函数

2.内存不够了还要朝里面拷贝直接程序挂了

C语言中内存函数的示例分析

memmove内存重叠拷贝

用来处理内存重叠的情况

C语言规定

memcpy 只要处理内存不重叠的拷贝就可以

memmove 处理重叠内存拷贝

我们重写memcpy的代码是满足C语言要求的,在vs这个编译器中memcpy实际上是超额完成任务了,他的效果已经和memmove效果一样了

C语言中内存函数的示例分析

你会发现他们跑出来的效果 是一样的,所以上面那个测试我就是用我自己的代码测试的(已经达到C语言的标准了)

我们再精细点就是memmove的内容了

原格式

C语言中内存函数的示例分析

分析

C语言中内存函数的示例分析

C语言中内存函数的示例分析

C语言中内存函数的示例分析

C语言中内存函数的示例分析

/*num是几个字节的意思*/
void* my_memmove(void* dest,const void* src, size_t num)//memmove和memcpy的参数是一样的
{
	assert(dest && src);
	void* ret = dest;
	if (dest < src)
	{
		while (num--)
		{
			//sre内存从前向后拷贝
			//和void*连用char*,分成最小然后一个一个传
			*(char*)dest = *(char*)src;
			((char*)dest)++;//void*无类型不好直接加加,就强转char*再加加
			((char*)src)++;
		}
	}
	else
	{
		while (num--)
		{
			//sre内存从后向前拷贝
			//和void*连用char*,分成最小然后一个一个传
			*((char*)dest+num) = *((char*)src+num);
			//((char*)dest)++;//void*无类型不好直接加加,就强转char*再加加
			//((char*)src)++;
		}
	}	
	return ret;
}

C语言中内存函数的示例分析

memset内存设置

将缓冲区设置为指定的字符。

原格式

C语言中内存函数的示例分析

memcmp内存比较

和strcmp相似,只不过一个是比较字符串,一个比较内存,由于不知道什么类型,所以后面有字节个数限制,准确的说应该和strncmp相似,因为后面都有一个个数的参数

原格式

C语言中内存函数的示例分析

分析

基本和字符串比较一样,就是变成了内存比较罢了

C语言中内存函数的示例分析

C语言中内存函数的示例分析

//buf1内存里的内容比buf2内存里的内容大就>0,反之<0
int my_memcmp(const void* buf1, const void* buf2, size_t count)
{
	assert(buf1 && buf2);
	while (--count && *(char*)buf1 == *(char*)buf2)//这个先减减就是细节
	{
		((char*)buf1)++;
		((char*)buf2)++;
	}
	if (*(char*)buf1 - *(char*)buf2 > 0)
		return 1;
	if (*(char*)buf1 - *(char*)buf2 < 0)
		return -1;
	return 0;
}

给你count不要乱超,因为他操作的是内存,没有字符串补\0的功能

关于“C语言中内存函数的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

推荐阅读:
  1. sql server中内存的示例分析
  2. JVM中内存对象的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:python整数和变量的知识点整理

下一篇:如何使用php foreach修改值

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》