赞
踩
前面两篇文章介绍了字符串函数,不过它们都只能用来处理字符串,C语言中也内置了一些内存函数来对不同类型的数据进行处理,本文将介绍:memcpy()使用以及模拟实现,memmove()使用以及模拟实现,memset()使用,memcmp()使用。
目录
函数参数及其返回类型:
- void* memcpy(void* destination, const void* source ,size_t num);
- //返回值为目标空间的起始地址
作用:
从源地址起复制num个字节到目标地址
注意点:
①memcpy函数不负责重叠内存的情况(如果源地址和目的地址有任何重叠,结果都是未定义的)
②头文件<string.h>
使用举例:
模拟实现:
- //memcpy模拟实现
- #include<assert.h>
- void* my_memcpy(void* s1, const void* s2, size_t num) {
- assert(s1 && s2);//防止传入空指针
- void* p1 = s1;
- //使用一个值保存首地址,等下好返回首地址
- while (num--) {
- *(char*)s1 = *(char*)s2;
- (char*)s1 = (char*)s1 + 1;
- //不能使用(char*)s1++,因为(char*)(强制类型转换)和++(自增)都是表达式
- //因为第一个表达式执行后是临时的,转换结果没被保存下来
- (char*)s2 = (char*)s2 + 1;
- }
- return p1;
- }
- int main() {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- int arr1[10] = { 0 };
- int i = 0;
- my_memcpy(arr1, arr, sizeof(arr));
- for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
- printf("%d ", arr1[i]);
- }
- return 0;
- }
运行结果:
函数参数及其返回类型:
- void* memmove(void* destination, const void* source ,size_t num);
- //返回值为目标空间的起始地址
作用:
从源地址起复制num个字节到目标地址(memmove函数能完全代替memcpy函数),尽量使用memmove函数
注意点:
①memcpy函数和memmove函数最大区别就是,memmove函数能实现源地址和目的地址有重叠的拷贝,所以memmove函数能完全代替memcpy函数
②头文件<string.h>
使用举例:
模拟实现:
前面我们已经实现了memcpy函数的模拟实现,现在我们面临唯一问题就是如何解决,源地址和目的地址有重叠的拷贝,经过分析我们发现重叠其实有两种情况:
①源头地址大于目标地址时
源地址从后往前拷贝
②目的地址大于源头地址时
源地址从前往后拷贝
代码:
- //memmove模拟实现
- #include<string.h>
- #include<assert.h>
- void* my_memmove(void* s1, const void* s2, size_t num) {
- assert(s1 && s2);
- void* ret = s1;
- if (s2 >= s1) {//①源头地址大于目标地址时
- while (num--) {
- *((char*)s1+num) = *((char*)s2+num);
- }
- }
- else {//②目的地址大于源头地址时
- while (num--) {
- *(char*)s1 = *(char*)s2;
- (char*)s1 = (char*)s1 + 1;
- (char*)s2 = (char*)s2 + 1;
- }
- }
- return ret;
- }
- int main() {
- int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
- my_memmove(arr + 5, arr, sizeof(arr[0]) * 5);
- for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
- printf("%d ", arr[i]);
- }
- return 0;
- }
运行结果:
函数参数及其返回类型:
- void* memset(void* ptr, int value ,size_t num);
- //返回值为被填充空间的起始地址
作用:
用来设置内存,将内存空间以字节为单位设置成想要内容
注意点:
①是以字节为单位设置的,当为int类型设置时可能出错
②头文件<string.h>
使用举例:
函数参数及其返回类型:
- int memcmp(const void* ptr1, const void* ptr2,size_t num);
- //返回值是大于:大于0的数,等于:0,小于:小于0的数
作用:
比较两块空间前num个字节
注意点:
①是以字节为单位比较
②头文件<string.h>
使用举例:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。