苏州网站建设建网站,温州网站升级,静态网站如何入侵,wordpress 在线知识库目录 系列文章目录 前言
1. memcpy使⽤和模拟实现
1.2 memcpy函数的模拟实现:
2. memmove 使⽤和模拟实现
2.1memmove的模拟实现#xff1a;
3. memset 函数的使⽤
4. memcmp 函数的使⽤ 系列文章目录 ✅作者简介#xff1a;大家好#xff0c;我是橘橙黄又青#xff…
目录 系列文章目录 前言
1. memcpy使⽤和模拟实现
1.2 memcpy函数的模拟实现:
2. memmove 使⽤和模拟实现
2.1memmove的模拟实现
3. memset 函数的使⽤
4. memcmp 函数的使⽤ 系列文章目录 ✅作者简介大家好我是橘橙黄又青一个想要与大家共同进步的男人
个人主页橘橙黄又青_C语言,指针-CSDN博客 前言 学习c语言的只要内存函数及其模拟实现掌握函数返回类型并模拟。
正文开始了
1. memcpy使⽤和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
函数内容作用复制数据和前面strcpy相似。返回类型无返回 1.函数memcpy从source的位置开始 向后复制 num个 字节 的数据到destination指向的内存位置. 2.这个函数在遇到 \0 的时候并不会停下来. 3.如果source和destination有任何的重叠复制的结果都是未定义的. 也就是说c语言对memcpy的定义是对 不重复内存数据类型进行复制举个例子: arr[20] {1, 2,3, 4, 5, 6, 7, 8}
memcpy(arr, arr3, 4)//把arr[2]向后的4个字节复制到arr向后的4个字节 memcpy复制都是在同一个数组内存重叠了这样是错误的。 memcpy的正确使用例子,代码1 #include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr1, 20);//把arr前面4个整形拷贝到arr2中int i 0;for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
} 输出结果 1.2 memcpy函数的模拟实现: #include stdio.h
#include string.hvoid * my_memcpy ( void * dst, const void * src, size_t count)//以字节单位复制
{void * ret dst;assert(dst);//断言是否为NULLassert(src);while (count--) {//搬运conut个字节*(char *)dst *(char *)src;//void不能解引用强制转换后在解引用。dst (char *)dst 1;//det但是void类型不能所以可以写成char*)dst;但是一些编译器不支持所以最好写成改代码这样。src (char *)src 1;}return(ret);//返回起始地址
}int main()
{int arr1[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int arr2[10] { 0 };my_memcpy(arr2, arr1 3, 5 * sizeof(arr[0]);//把4 5 6 78复制到arr2去int i 0;for (i 0; i 10; i){printf(%d , arr2[i]);}return 0;
} 那对于重叠的内存数据怎么解决呢cy语言对于重叠的内存交给memmove来处理。 2. memmove 使⽤和模拟实现 函数内容 void * memmove ( void * destination, const void * source, size_t num ); 函数内容作用复制数据。返回类型无返回。 1.和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。 2.如果源空间和⽬标空间出现重叠就得使⽤memmove函数处理。 举例1 #include stdio.h
#include string.h
int main()
{int arr1[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };memmove(arr12, arr1, 20);//把12345拷贝到arr1中的34567上。int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}return 0
} 输出结果 2.1memmove的模拟实现 代码分析时有3种情况待我慢慢给你们分析 void* my_memmove(void* dst, const void* src, size_t count)
{void* ret dst;if (dst src || (char*)dst ((char*)src count)) {//从后面往前面复制是第1.2种情况while (count--) {*(char*)dst *(char*)src;dst (char*)dst 1;src (char*)src 1;}}else {//从前面往后面复制.第3种情况选择从前面往后面复制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);
}
#include stdio.h
#include string.h
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1 2, arr1, 20);//把1234拷贝到arr1中的3456上。int i 0;for (i 0; i 10; i){printf(%d , arr1[i]);}return 0;
} 第1种情况 第2种情况 第3种情况 分析第2种 3. memset 函数的使⽤ 函数内容 void * memset ( void * ptr, int value, size_t num ); 功能memset是⽤来设置内存的将内存中的值以字节为单位设置成想要的内容。 案例1 #include stdio.h
#include string.h
int main ()
{char str[] hello world;memset (str,x,6);//把str前面6个字节换成xprintf(str);return 0;
} 输出结果 这里我们给一个错误案例2 #include stdio.h
#include string.h
int main()
{int arr[10] { 0 };memset(arr, 1, 40);printf(arr);return 0;
} 输出结果 总结memset函数是以字节为单位来改的 4. memcmp 函数的使⽤ 函数内容 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 功能⽐较从ptr1和ptr2指针指向的位置开始向后的num个字节。 返回类型int以strcmo相似。 案例1 #include stdio.h
#include string.h
int main()
{char buffer1[] DWgaOtP12df0;char buffer2[] DWGAOTP12DF0;int n memcmp(buffer1, buffer2, sizeof(buffer1));if (n 0) printf(%s is greater than %s.\n, buffer1, buffer2);else if (n 0) printf(%s is less than %s.\n, buffer1, buffer2);elseprintf(%s is the same as %s.\n, buffer1, buffer2);return 0;
} 输出结果 好了今天就分享到这里了都看到这里了点一个赞吧谢谢。