C语言的编程之美之内存函数
目录
- 内存函数
- memcpy内存拷贝
- 原格式
- 分析
- 内存拷贝的问题
- memmove内存重叠拷贝
- C语言规定
- 原格式
- 分析
- memset内存设置
- 原格式
- memcmp内存比较
- 原格式
- 总结
内存函数
memcpy内存拷贝
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 ‘\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
原格式
文章图片
分析 **字面上意思只要是内存里面的东西就都可以进行拷贝,所以就打破了字符串拷贝的魔咒,什么类型都可以进行拷贝,那就不需要想来,肯定回和万能类型(通用类型指针-无类型指针)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.内存相关连的话,就会拷贝错误
文章图片
那你怎么解决内存相关连还不会有上面的错误,正面赋值交集的内存空间会被操作两次,就会改变原来的值,那我们怎么做呢,如果从后面来呢,前面操作两次会把后面的变了,那就先把后面的拿走赋值,不就间接的改变了原来会变的情况了吗,所以这样上面的代码就得修改了,这是朝后面拷贝的情况,如果提目是朝前面拷贝的话,是不是从后面来就有问题了,反而从前面来会比较完美,所以我们得两种情况都得考虑到
所以为了解决重叠拷贝的问题就有了memmove这个函数
2.内存不够了还要朝里面拷贝直接程序挂了
文章图片
【C语言的编程之美之内存函数】
memmove内存重叠拷贝
用来处理内存重叠的情况
C语言规定 memcpy 只要处理内存不重叠的拷贝就可以
memmove 处理重叠内存拷贝
我们重写memcpy的代码是满足C语言要求的,在vs这个编译器中memcpy实际上是超额完成任务了,他的效果已经和memmove效果一样了
文章图片
你会发现他们跑出来的效果 是一样的,所以上面那个测试我就是用我自己的代码测试的(已经达到C语言的标准了)
我们再精细点就是memmove的内容了
原格式
文章图片
分析
文章图片
文章图片
文章图片
文章图片
/*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; }
文章图片
memset内存设置
将缓冲区设置为指定的字符。
原格式
文章图片
memcmp内存比较
和strcmp相似,只不过一个是比较字符串,一个比较内存,由于不知道什么类型,所以后面有字节个数限制,准确的说应该和strncmp相似,因为后面都有一个个数的参数
原格式
文章图片
分析
基本和字符串比较一样,就是变成了内存比较罢了
文章图片
文章图片
//buf1内存里的内容比buf2内存里的内容大就>0,反之<0int 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的功能
总结 本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量