C语言的编程之美之内存函数

 更新时间:2021年09月13日 15:46:18   作者:小码农UU  
这篇文章主要介绍了C语言全部内存操作函数的实现详细讲解,作者用图文代码实例讲解的很清晰,有感兴趣的同学可以研究下

内存函数

memcpy内存拷贝

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 ‘\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

原格式

image-20210912150415470

分析

**字面上意思只要是内存里面的东西就都可以进行拷贝,所以就打破了字符串拷贝的魔咒,什么类型都可以进行拷贝,那就不需要想来,肯定回和万能类型(通用类型指针-无类型指针)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.内存相关连的话,就会拷贝错误

image-20210912174618496

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

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

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

image-20210912175703527

memmove内存重叠拷贝

用来处理内存重叠的情况

C语言规定

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

memmove 处理重叠内存拷贝

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

image-20210912201352859

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

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

原格式

image-20210912195704561

分析

image-20210912200345318

image-20210912210111460

image-20210912210718304

image-20210912212544483

/*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;
}

image-20210912215713723

memset内存设置

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

原格式

image-20210912224129279

memcmp内存比较

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

原格式

image-20210912222610487

分析

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

image-20210912233051911

image-20210912233234287

//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语言数组实现扫雷游戏

    C语言数组实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言数组实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C语言实现简单翻译功能

    C语言实现简单翻译功能

    这篇文章主要为大家详细介绍了C语言实现简单翻译功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C/C++利用libxml2高效输出XML大文件详解

    C/C++利用libxml2高效输出XML大文件详解

    这篇文章主要给大家介绍了关于C/C++利用libxml2高效输出XML大文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • boost.asio框架系列之调度器io_service

    boost.asio框架系列之调度器io_service

    这篇文章介绍了boost.asio框架系列之调度器io_service,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Qt中QtWebEngine加载本地网页跨域问题的总结

    Qt中QtWebEngine加载本地网页跨域问题的总结

    本文主要介绍了Qt中QtWebEngine加载本地网页跨域问题的总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • C语言数据结构创建及遍历十字链表

    C语言数据结构创建及遍历十字链表

    这篇文章主要介绍了C语言数据结构十字链表的创建及遍历,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-10-10
  • Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享)

    下面小编就为大家带来一篇Linux下C语言的几道经典面试题小结(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Mygui中文换行问题解决方案

    Mygui中文换行问题解决方案

    相信大家解决了中文输入后一定会遇到如何解决中文输入的问题,中文输入换行问题是很多gui框架都存在的一个问题,需要的朋友可以了解下
    2012-11-11
  • 利用C语言实现顺序表的实例操作

    利用C语言实现顺序表的实例操作

    顺序表是线性表中的一种重要的数据结构,也是最基础的数据结构,所以他不仅是学习中的重点,也是应用开发非常常用的一种数据结构。这篇文章介绍如何利用C语言实现顺序表。
    2016-08-08
  • C++ 双向循环链表类模版实例详解

    C++ 双向循环链表类模版实例详解

    这篇文章主要为大家详细介绍了C++ 双向循环链表类模版实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02

最新评论