高端网站设计多少钱,做机器人的网站,平面设计图网站有哪些?,广州做网站优化费用创作不易#xff0c;友友们给个三连吧#xff01;#xff01;
C语言标准库中有这样一些内存函数#xff0c;让我们一起学习吧#xff01;#xff01;
一、memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
1.1 使…
创作不易友友们给个三连吧
C语言标准库中有这样一些内存函数让我们一起学习吧
一、memcpy函数的使用和模拟实现
void * memcpy ( void * destination, const void * source, size_t num );
1.1 使用的注意事项
1、函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2、这个函数在遇到 \0 的时候并不会停下来。
3、如果source和destination有任何的重叠复制的结果都是未定义的。
4、返回的是目标空间的地址destination
5、memcpy函数可以实现整型拷贝、字符拷贝、结构体拷贝等等所以参数和返回值都是void*
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr1, 5 * sizeof(int));//将1、2、3、4、5 拷贝到arr2中for (int i 0; i 10; i)printf(%d , arr2[i]);return 0;
} 输出结果1 2 3 4 5 0 0 0 0 0 如果我想将 4 5 6 7 8 拷贝到arr2呢
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memcpy(arr2, arr13, 5 * sizeof(int));//将4 5 6 7 8拷贝到arr2中for (int i 0; i 10; i)printf(%d , arr2[i]);return 0;
} 输出结果4 5 6 7 8 0 0 0 0 0 这说明我们可以通过指针的加减来改变我们在数组中的接收地址
1.2 memcpy的模拟实现
void* my_memcpy(void* des, const void* src, size_t num)
{assert(des src);//确保不传NULL进来void* ret des;//记住返回值//因为memcpy实现的是任何数据类型的拷贝且num是字节所以强转成char*进行运算最合适while (num--){//一次拷贝一个字节*(char*)des *(char*)src;////迭代 因为强制类型转化的效果是临时的要一直强转才能运算des (char*)des 1;src (char*)src 1;}return ret;
}
二、memmove函数的使用和模拟实现
C语言规定memcpy拷贝的是不重叠的内存而memmove拷贝的是重叠的内存 void * memmove ( void * destination, const void * source, size_t num ); 虽然在vs2022中memcpy也是可以拷贝重叠内存的但是其他编译器就不一定了所以我们在使用的时候尽量是不重叠的用memcpy重叠的用memmove
2.1 使用的注意事项
1、和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
2、如果源空间和⽬标空间出现重叠就得使⽤memmove函数处理。
int main()
{int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] { 0 };memmove(arr12, arr1, 5 * sizeof(int));//将1、2、3、4、5 拷贝到原来3、4、5、6、7的位置for (int i 0; i 10; i)printf(%d , arr1[i]);return 0;
} 输出结果1 2 1 2 3 4 5 8 9 10 2.2 memmove的模拟实现 void* my_memmove(void* dst, const void* src, size_t num)
{assert(dst src);//确保不传NULL进来void* ret dst;//记住返回值if (dst src)//从前往后和memcpy一样{while (num--){//一次拷贝一个字节*(char*)dst *(char*)src;////迭代 因为强制类型转化的效果是临时的要一直强转才能运算dst (char*)dst 1;src (char*)src 1;}}else//从后往前while (num--)//要跳num-1个字节*((char*)dst num) *((char*)src num);return ret;
}
三、memset函数的使用和模拟实现
void * memset ( void * ptr, int value, size_t num ); 3.1 使用的注意事项
memset是⽤来设置内存的将内存中的值以字节为单位设置成想要的内容。
int main ()
{char str[] hello world;memset (str,x,6);printf(str);return 0;
} 输出结果xxxxxxworld 注意该函数是以字节为单位操作的
如果我们操作的是int类型的数组会怎样
int main()
{int arr[] {1,2,3,4,5,6,7,8,9,10};memset(arr, 1, 10);for (int i 0; i 10; i)printf(%d , arr[i]);return 0;
} 输出结果 16843009 16843009 257 4 5 6 7 8 9 10 为什么会是这样的结果下面进行分析 3.2 memset的模拟实现
void* my_memset(void* ptr, int value, size_t num)
{while (num--){*(char*)ptr value;ptr (char*)ptr 1;}
}
四、memcmp函数的使用
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
1、⽐较从ptr1和ptr2指针指向的位置开始向后的num个字节
2、返回值如下 int main()
{int arr1[] { 1,2,3,4,5,6,7,8 };int arr2[] { 1,2,3,8 };printf(%d\n, memcmp(arr1, arr2, 12));
} 输出结果0 如果我们比较13个字符呢
int main()
{int arr1[] { 1,2,3,4,5,6,7,8 };int arr2[] { 1,2,3,8 };printf(%d\n, memcmp(arr1, arr2, 13));
} 输出结果-1 因为小端存储所以arr1的第13个字节存储的是04而arr2的第13个字节存储的是08所以返回-1