C语言内存函数

目录

memcpy函数的使用和模拟实现

memmove函数的使用和模拟

memset函数的使用

 memcmp函数的使用


memcpy函数的使用和模拟实现

void * memcpy ( void * destination, const void * source, size_t num );

 头文件是<string.h>

1、函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。

2、这个函数在遇到 '\0' 的时候并不会停下来。

3、如果source和destination有任何的重叠,复制的结果都是未定义的。memcpy对内存重叠的情况不负责(例如:a1,a1+2)

memcpy 函数用于将源内存块中的数据复制到目标内存块中,但不允许源内存块和目标内存块重叠。如果重叠,memcpy 的行为是未定义的,可能导致数据损坏。)

函数的使用:

#include <stdio.h>
#include <string.h>

int main() {
	int a[] = { 1,2,3,4,5,6,7,8 };
	int b[20] = { 0 };
	memcpy(b, a, 20);
	for (int i = 0; i < 20; i++) {
		printf("%d ", b[i]);
	}
	return 0;
}

函数的模拟:

#include <stdio.h>
#include <assert.h>
void* my_memcpy(void* des, const void* sour, size_t n) {
	assert(des && sour);
	while (n--) {
		//解引用后一次访问一个字节,一个字节一个字节的复制给des
		*((char*)des)++ = *((char*)sour)++;
	}
}
int main() {
	int a[] = { 1,2,3,4,5,6,7,8 };
	int b[20] = { 0 };
	my_memcpy(b, a, 20);
	for (int i = 0; i < 20; i++) {
		printf("%d ", b[i]);
	}
	return 0;
}

*((char*)des)++ = *((char*)sour)++;  先将指针的类型强制转换为char* ,使它一次只能位移一个字节大小的空间,解引用后即为这1个字节的空间中的值

这一句代码的原理如下图:


memmove函数的使用和模拟

void * memmove ( void * destination, const void * source, size_t num );

 num的单位是字节

头文件是<string.h>

1、和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。

2、如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。memmove函数针对源空间和目标空间重叠的情况

memmove 函数会根据内存块的重叠情况,选择合适的方式进行数据复制,确保数据不会被损坏。)

函数的使用:

#include <stdio.h>
#include <string.h>

int main() {
	int a[20] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(a + 2, a, 20);
	for (int i = 0; i < 20; i++) {
		printf("%d ", a[i]);
	}
	return 0;
}

 a+2 开始往后被赋值为1,2,3,4,5

函数的模拟:

不创建新数组,当有源空间与目标空间有重叠时的赋值方法如下:

1、

2、

#include <stdio.h>
#include <assert.h>
void* my_memmove(void* dest, const void* src, size_t n) {
	assert(dest && src);
	if (dest > src) {
		//后到前
		//指定到第20个字节处
		(char*)src += n - 1;
		(char*)dest += n - 1;
		while (n--) {
			*((char*)dest)-- = *((char*)src)--;
		}
	}
	else {
		//前到后
		while (n--) {
			*((char*)dest)++ = *((char*)src)++;
		}
	}

}
int main() {
	int a[20] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memmove(a, a + 2, 20);
	for (int i = 0; i < 10; i++) {
		printf("%d ", a[i]);
	}
	return 0;
}

最后结果为:3 4 5 6 7 6 7 8 9 10


 

memset函数的使用

void * memset ( void * ptr, int value, size_t num );

 num的单位是字节

头文件是<string.h>

 1、memset是⽤来设置内存的,将内存中的值以字节为单位设置成想要的内容

2、对于整型数组,value的值只能是0,因为num的单位是字节;如果value的值是1,则会将整型数据中的4个字节全部改为1,结果是一个非常大的数

函数的使用:

#include <stdio.h>
#include <string.h>

int main() {
	char a[] = "hello world";
	memset(a, 'x', 5);
	printf("%s\n", a);
	return 0;
}

结果:xxxxx world


 

 memcmp函数的使用

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

1、比较从ptr1和ptr2指针指向的位置开始,向后的num个字节

2、如果在num个字节之前就比较出了大小,则停止,num相当于最多向后num个字节

当 ptr1 > ptr2 时返回 一个大于0的数,相等时返回0,小于时返回一个小于0的数 

#include <stdio.h>
#include <string.h>
int main()
{
 char buffer1[] = "DWgaOtP12df0";
 char buffer2[] = "DWGAOTP12DF0";
 int n;
 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);
 else
 printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
 return 0;
}

创作不易,喜欢的话点个赞吧~~

  • 33
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值