c语言:常用的内存函数

前言

        在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的行为就是确定的了,它会把重叠区域被修改前的内容拷贝过去。

结语

        以上就是一些关于常用的内存函数的知识了,希望对你有所帮助,最后记得点赞收藏加关注😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值