今天的博文较短,浅浅总结了下有关内存的操作函数,还是老样子,有问题还请大家帮忙斧正,好了,那让我们开始学习叭!
目录
1,memcpy()
void * memcpy ( void * destination, const void * source, size_t num );
作用:作用与strncpy函数相似,只不过memcpy函数可以针对所有类型的数据进行拷贝。注意,在这个函数中,num是按字节算的,而在字符串操作函数里面是按字符个数算的。
1.1,细节
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
1.2,使用示例
1.3,模拟实现
//模拟实现memcpy,函数返回值是目标空间的起始地址
#include<assert.h>
void* my_memcpy(void* dest, const void* src, size_t num) {
assert(dest && src);
void* ret = dest;
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int arr1[5] = { 0 };
int* p = (int*)my_memcpy(arr1, arr, 20);
printf("%d\n", *p);
return 0;
}
对于memcpy()函数而言,他的拷贝是针对于所有类型的数据的,所以在函数的返回值与参数都是设计的void* 类型,具有普适性,并且在进行拷贝的时候也是一个字节一个字节的进行拷贝。 注意:我们在进行解引用的时候得现需要转换为强制类型转换为char*类型,但是强制类型转换不是永久性的转换,只是说你在某个时刻将他转换为了某一个特定的类型,所以我们上面在使用的时候强制转换了几次。
但是,memcpy()有一个问题,就是对于重叠内存的拷贝他是不行的,这个时候只能依托于一个专门用来拷贝重叠内存空间数据的函数memmove()
2,memmove()
void * memmove ( void* destination, const void * source, size_t num );
作用:针对于内存重叠的数据拷贝。
2.1,细节
- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就得使用memmove函数处理。
2.2,使用示例
2.3,模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, size_t num) {
assert(dest && src);
void* ret = dest;
if (dest < src ) {
//从前往后拷贝
while (num--) {
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else {
//从后往前拷贝
while (num--) {
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main() {
int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
my_memmove(arr1, arr1 + 2, 20);
for (int i = 0;i < 10;i++) {
printf("%d ", arr1[i]);
}
return 0;
}
解析:
其实memmove()函数就是针对于重叠空间的拷贝而生的,但是它同样也可以用于不重叠空间的拷贝,比如上面在arr1内部,你的目标空间与源空间不重叠的话,根本就不需要分什么前后拷贝顺序,都是一样的,这个时候他的作用就与memcpy()函数是一样的了。
最后其实提一个点,前面建立好印象后可以告诉大家,在现在的编译器下,比如VS,memcpy函数已经被优化的和memmove函数的功能一样了。
3,memcmp()
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
作用:比较从ptr1和ptr2指针开始的num个字节,这个比较函数strncmp函数有一些相似,只不过memcmp函数是在内存上一个字节一个字节的去比较,并且它是可以适用于不同类型的数据的。
返回值如下:
3.1,使用示例
可以通过内存图看到,数据在内存中的存储形式如此,memcmp()则会以字节为单位去一个个比较,而并不是直接比较两个数值的大小。
4,memset()
void* memset(void* dest,int c,size_t count);
作用:内存设置函数,以字节为单位,将内存中的数据设置为你想要设定的数值。
4.1,使用示例
注意一点,就是一定都是按字节处理的,所以你设定的数是会把每一个字节上的数都改成你想设定的数值。
最后的最后,如果大家觉得文章还凑合的话,免费的赞,关注走一走哦,灰常感谢!