前言
在c语言中还有一些会用到的内存函数, 这里 就简单的讲一下常用的几个内存函数。
正文
memcmp
函数原型:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );参数:
ptr1 和 ptr2 是要比较的两个空间的地址,num 是要比较的空间的大小(字节)
返回值:
如果 ptr1 的内容大于 ptr2 就返回大于 0 的值,小于就返回小于 0 的值,相等就返回 0
注:
该函数与我们常用的strcmp不同,strcmp比较到 '\0' 会停止,而memcmp不会,它会比较到我们指定的那么多空间为止。
memcmp就是来帮助我们比较两块空间的内容的大小的,相比于strcmp它可以比较的范围更广,因为strcmp只可以比较字符串。
memset
函数原型:
void * memset ( void * ptr, int value, size_t num );参数:
ptr1是要改动的内存块的地址,value是要给内存填充的值,类型是int,其实就是给每个字节的空间填充该整型,num就是要填充的空间(字节)的大小了。
比较常见的使用就是初始化了,比如要把一个数组的内容都初始化为 0
#include<stdio.h>
#include<string.h>
int main()
{
int a[10] = {0};
memset(a, 0, sizeof(int)*10);
for(int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
需要注意的是,这里的初始化为0,是把每个字节的空间的内容都换为0了,然后按照整型的读取方法读取出来,全是0没有问题,但是如果我们把填充的0写为1,读取出来的可就不是十个 1了。它是把每个字节的内容填充为那个填充值,要是读取字符串的话,用这个来填充字符串还是很方便的,但是要是读取整型等就得注意。(不知道数据怎么读取的可以看一下我的 数据在内存中的存储 那篇博客)
memcpy
函数原型:
void * memcpy ( void * destination, const void * source, size_t num );参数:
destination 是要放到的地址,source 是读取的地址,num是要复制过去的内容的空间大小(字节)
注:memcpy也不看 '\0',和memcmp一样,只依据 num
在使用memcpy时, 要确保读取和写入的空间不重叠,否则不一定稳妥,因为如果重叠,程序行为就有可能就于我们所期望的有所偏差,这是不确定的(c语言不能保证是我们想要的结果)。
就拿上图举例,source是空间是绿色和红色的区域,destination是红色和蓝色的区域,当我们把source的内容不断放到destination中去时,红色区域的内容一开始就被覆盖了,然后,然后当继续拷贝时,当读取到红色区域后,读取的到底是修改后的呢,还是修改之前的呢?这就不确定了。所以面对这种重叠的区域时,就可以用到memmove函数了。
memmove
函数原型:
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
相对于memcpy面对重叠区域的不确定,memmove的行为就是确定的了,它会把重叠区域被修改前的内容拷贝过去。
结语
以上就是一些关于常用的内存函数的知识了,希望对你有所帮助,最后记得点赞收藏加关注😁