北京理工大学网站网页设计揭阳做网站哪个好
news/
2025/9/26 5:09:59/
文章来源:
北京理工大学网站网页设计,揭阳做网站哪个好,网址导航大全软件下载,大学网站建设图文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力#xff01; 内存函数是用于
操作内存块的一组函数#xff0c;它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在
str… 文章目录 1. memcpy函数2. memmove函数3. memset函数4. memcmp函数希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力 内存函数是用于
操作内存块的一组函数它们可以对内存进行复制、移动、设置和比较等操作。这些函数主要在
string.h 头文件中声明其操作对象通常是字节序列不管这些字节代表的是字符、整数还是其他数据类型 1. memcpy函数
memcpy 主要用于将一段内存中的数据完整地复制到另一段内存中在很多场景下都非常有用例如在处理数组、结构体等数据结构时从源内存地址 src 复制 n 个字节的数据到目标内存地址 destination 传送门memcpy-C参考 参数destination-目标内存地址它是一个 void* 类型的指针source-源内存地址同样是 void* 类型(不可修改)num-要复制的字节数
返回值返回指向目标内存地址 destination 的指针
值得注意的是函数 memcpy 从 source 的位置开始向后复制 num 个字节的数据 destination 指向的内存位置这个函数在遇到 ‘\0’ 的时候并不会停下来如果 source 和destination 有任何的重叠复制的结果都是未定义的
eg
#include stdio.h
#include string.hint main()
{char src[] Hello, World!;char dest[20];memcpy(dest, src, strlen(src)1);printf(%s\n, dest);return 0;
}memcpy 函数将 src 数组中的字符串包括字符串结束符 \0 复制到 dest 数组中 strlen(src)1 是为了把 \0 也复制过去 memcpy 的模拟实现
void* memcpy(void* dst, const void* src, size_t count)
{void* ret dst;assert(dst);assert(src);/** copy from lower addresses to higher addresses*/while (count--) {*(char*)dst *(char*)src;dst (char*)dst 1;src (char*)src 1;}return(ret);
}将dst和src先强制转换为char*类型实现了以字节为单位的访问和赋值操作因为 char类型在内存中占用一个字节所以这样可以逐个字节地复制数据而不管原始数据的类型是什么分别将目标地址 dst 和源地址 src 向后移动一个字节的位置以便在下一次循环中复制下一个字节的数据 2. memmove函数
memmove 和 memcpy 类似也是从源内存地址 source 复制 num 个字节的数据到目标内存地址destination 但是 memmove 函数能够处理源内存区域和目标内存区域重叠的情况 传送门memmove-C参考 参数destination-目标内存地址它是一个 void* 类型的指针source-源内存地址同样是 void* 类型(不可修改)num-要复制的字节数
返回值返回指向目标内存地址 destination 的指针
值得注意的是和 memcpy 的差别就是 memmove 函数处理的源内存块和目标内存块是可以重叠的如果源空间和目标空间出现重叠就得使用 memmove 函数处理
eg
#include stdio.h
#include string.hint main()
{char str[] abcdef;// 将字符串中的后3个字符向前移动2个位置memmove(str 2, str 3, 3);printf(%s\n, str);return 0;
}str 3 是源地址str 2 是目标地址存在重叠部分memmove 函数可以正确地完成复制操作而 memcpy 函数不能完成有重叠的操作
mememove 的模拟实现
void* memmove(void* dst, const void* src, size_t count)
{void* ret dst;if (dst src || (char*)dst ((char*)src count)) {/** Non-Overlapping Buffers* copy from lower addresses to higher addresses*/while (count--) {*(char*)dst *(char*)src;dst (char*)dst 1;src (char*)src 1;}}else {/** Overlapping Buffers* copy from higher addresses to lower addresses*/dst (char*)dst count - 1;src (char*)src count - 1;while (count--) {*(char*)dst *(char*)src;dst (char*)dst - 1;src (char*)src - 1;}}return(ret);
}首先判断源内存区域和目标内存区域是否有重叠情况然后就是分为非重叠和重叠的情况和 memcpy 模拟实现类似的操作 3. memset函数
memset 能将指定内存区域 ptr 的前 num 个字节设置为指定的值 value 传送门memset-C参考 参数ptr-要设置的内存区域的起始地址是 void* 类型value-要设置的值这个值会被转换为 unsigned char 类型后进行设置num-要设置的字节数
返回值返回指向设置后的内存区域 ptr 的指针
值得注意的是设置完内容后记得在后面加上 \0
eg
#include stdio.h
#include string.hint main()
{char buffer[10];memset(buffer, A, 5);buffer[5]\0;printf(%s\n, buffer);return 0;
}memset 将 buffer 数组的前 5 个字节设置为字符A然后手动添加字符串结束符 \0 以便能够正确地使用 printf 输出字符串
4. memcmp函数
memcmp 用于比较两个内存区域 ptr1 和 ptr2 的前 num 个字节 传送门memcmp-C参考 参数ptr1、ptr2-要比较的两个内存区域的起始地址都是 const void* 类型num-要比较的字节数
返回值 • 如果 ptr1 所指向的内存区域的前 num 个字节大于 ptr2 所指向的内存区域的前 num 个字节返回一个大于 0 的值 • 如果 ptr1 所指向的内存区域的前 num 个字节小于 ptr2 所指向的内存区域的前 num 个字节返回一个小于 0 的值 • 如果 ptr1 所指向的内存区域的前 num 个字节等于 ptr2 所指向的内存区域的前 num 个字节返回 0
值得注意的是比较从 ptr1 和 ptr2 指针指向的位置开始向后的 num 个字节遇到第一个不一样的比较就行了
eg
#include stdio.h
#include string.hint main()
{char str1[] abc;char str2[] abd;int result memcmp(str1, str2, 3);printf(%d\n, result);return 0;
}memcmp 比较 str1 和 str2 的前 3 个字节因为 c 的 ASCII 码小于 d 的 ASCII 码所以返回一个小于 0 的值
以上就是主要使用的内存函数过几天就参加全国计挑了希望可以拿个奖没拿到就当练手了吧毕竟竞赛经验更重要
希望读者们多多三连支持
小编会继续更新
你们的鼓励就是我前进的动力
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917875.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!