内存函数

有任何不懂的问题可以评论区留言,能力范围内都会一一回答

1.memcpy

头文件:#include <sting.h>

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

1.函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。
2.这个函数在遇到'\0'的时候并不会停下来。

(后面几个函数同理)
3.如果source和destination有任何的重叠,复制的结果都是未定义的。

4.对于内存重叠的地方交给memmove处理

5.由于这个函数memcpy可以处理不同类型的数据,因此这个函数的参数类型是void*

可以用来接收不同的数据,使用的时候再用(int*)强转就可以了

(后面几个函数同理)

6.返回值:目标空间起始地址(destination)

7.num的单位是字节

8.目标空间必须足够大,以确保能存放源字符串。
9 .目标空间必须可修改。

2.memmove

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

返回值:目标空间起始地址(destination)

这个函数和memcpy很相似,我们直接做一个类比

memcpy :用于从一个内存位置复制数据到另一个内存位置,当源和目标位置没有重叠时,它能够有效地完成任务。
memmove :也用于复制内存块,但它特别处理了源和目标位置重叠的情况,确保数据被正确复制,不会被覆盖。


内存重叠处理 :

memcpy :在源和目标位置重叠的情况下,其行为是未定义的,可能导致数据覆盖。
memmove :优化了重叠内存复制的过程,避免了数据覆盖问题。它根据源和目标的相对位置决定是从前向后还是从后向前复制数据。

调用场景 :

memcpy :适用于源和目标位置没有重叠的情况,是最快的内存复制操作之一。
memmove :用于源和目标位置可能重叠的情况,确保数据完整性。

总结来说,如果你需要确保在有重叠内存的情况下进行数据复制不会导致问题,那么应该使用 memmove 。

如果你确定源和目标位置没有重叠,且需要更高的执行效率,则可以使用 memcpy 。

3.memset

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

memset是用来设置内存的。将内存中的值以字节为单位设置成想要的内容。

将ptr指向的内存块的第一个num字节设置为指定的value

参数:

ptr:指向要填充的内存块的指针

value:要设置的值。该值以int形式传递,但函数使用此值的unsigned char转换填充内存块。

num:要设置为该值的字节数。

返回值:目标空间起始地址(destination)

4,memcmp

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

·比较从ptr1和ptr2指针指向的位置开始,向后的num个字节
 返回值如下:

当ptr1指向的元素比ptr2大时返回一个大于0的值

当ptr1指向的元素比ptr2小时返回一个小于0的值

当ptr1指向的元素比ptr2相等时返回一个等于0的值

这个函数和strncmp有点相似

我们直接做一个区分


首先, memcmp 是一个 比较内存块的函数 ,它比较的是两个内存区域的内容是否相等,不考虑字符串的终止符 \0 。因此,它常用于比较非字符串类型的数据块,例如结构体或数组。

相反, strncmp 是一个 用于比较字符串的函数 ,它比较的是两个字符串的前n个字符是否相同,其中n是用户指定的比较长度。如果字符串的前n个字符相同, strncmp 会返回0;否则,它会根据字符的比较结果返回一个负数或正数。

其次, memcmp 是按照字节(byte-wise)进行比较的,而 strncmp 则是按照字符(char-wise)进行比较的。这意味着,如果字符串中包含填充空格或由于边界对齐而添加的额外空格, memcmp 可能会给出不正确的结果,而 strncmp 在这种情况下表现更好。

最后, memcmp 在处理字符串时的效率通常更高,因为它不需要检查终止符 \0 ,这使得它在比较大的数据块时更加高效1。

总结来说,选择使用 memcmp 还是 strncmp 主要取决于您的具体需求:如果您需要比较的是内存块而不仅仅是字符串,或者涉及到填充字符的比较, memcmp 更为合适;如果您只关心字符串的开头部分, strncmp 则更为精确。

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值