C语言之内存操作函数

今天的博文较短,浅浅总结了下有关内存的操作函数,还是老样子,有问题还请大家帮忙斧正,好了,那让我们开始学习叭!

目录

1,memcpy()

1.1,细节

1.2,使用示例

1.3,模拟实现

2,memmove()

2.1,细节

2.2,使用示例 

 2.3,模拟实现

3,memcmp() 

 3.1,使用示例

 4,memset()

4.1,使用示例


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,使用示例

注意一点,就是一定都是按字节处理的,所以你设定的数是会把每一个字节上的数都改成你想设定的数值。 

最后的最后,如果大家觉得文章还凑合的话,免费的赞,关注走一走哦,灰常感谢!

 

猜你喜欢

转载自blog.csdn.net/qq_61688804/article/details/123710041