博客主页:https://blog.csdn.net/weixin_46094737?type=blog
欢迎评论⭐留言 如有错误敬请指正!
本文由小学生廉原创,首发于 CSDN
未来很长,值得我们全力奔赴更美好的生活!
char a[5];
memset(a,'a',5);
puts(a);
运行结果:
注意事项:
memset函数是按照字节对内存块进行初始化,所以不能用它将int数组出初始化为0和-1之外的其他值(除非该值高字节和低字节相同)。
其实c的实际范围应该在0~255,因为memset函数只能取c的后八位给所输入范围的每个字节。也就是说无论c多大只有后八位二进制是有效的。
memset函数在初始化处理时非常方便,但也有其局限性,比如要注意初始化数值,要注意字节数等等。当然,直接选择用for循环或while循环来进行初始化也是可以的,只不过memset更快捷一些。
基本原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);
主要功能:比较内存区域buf1和buf2的前count个字节。
返回值:
当buf1
当buf1=buf2时,返回值=0
当buf1>buf2时,返回值>0
//a[0] 10 00 00 00
//a[1] 20 00 00 00
int a[2]={10,20};
int b[2]={10,11};
//a[0] 10 00 00 00
//a[1] 11 00 00 00
int ret=-1;
ret=memcmp(a,b,5);//内存比较函数,相同为0,不同为1(字节!!!!)
printf("ret=%d",ret);
运行结果:ret=1
说明:该函数是按字节比较的。
例如:
s1,s2为字符串时候memcmp(s1,s2,1)就是比较s1和s2的第一个字节的ascII码值;
memcmp(s1,s2,n)就是比较s1和s2的前n个字节的ascII码值,如:
char *s1="abc";
char *s2="acd";
int r=memcmp(s1,s2,3);
就是比较s1和s2的前3个字节,第一个字节相等,第二个字节比较中大小已经确定,不必继续比较第三字节了所以r=-1.
memmove内存拷贝函数,功能是拷贝n个字节到目标地址,目标内存和源地址内存可以重叠。
另外一个内存拷贝函数memcpy,不可以内存重叠。
memmove不是一个安全的函数,因此要注意拷贝时,有越界的产生。一个长度n的数组,使用memmove向后移一位,最多能拷贝n-2个字节。
int a[10]={11,12,13,14,15,16,17,18,19,20};
memmove(a,a+5,12);
puts(a);
运行结果:
memcpy函数是C语言中的一个用于内存复制的函数,声明在 string.h 中。其原型是:
void test_01(void)//测试字符串,但是memcpy复制还是一个一个字符去复制
{
char str01[]="hello,ni,hao";
char str02[20];
memcpy(str02,str01,12);
print_c(str02,12);
}
运行结果:
p[0]=h p[1]=e p[2]=l p[3]=l p[4]=o p[5]=, p[6]=n p[7]=i p[8]=, p[9]=h p[10]=a p[11]=o
作用是:以source指向的地址为起点,将连续的n个字节数据,复制到以destin指向的地址为起点的内存中。
函数有三个参数,第一个是目标地址,第二个是源地址,第三个是数据长度。
使用memcpy函数时,需要注意:
使用memcpy函数时,特别要注意数据长度。如果复制的数据类型是char,那么数据长度就等于元素的个数。而如果数据类型是其他(如int, double, 自定义结构体等),就要特别注意数据长度的值。
好的习惯是,无论拷贝何种数据类型,都用 n * sizeof(type_name)
的写法。