有任何不懂的问题可以评论区留言,能力范围内都会一一回答
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 则更为精确。