1,memcpy、memmove函数以及二者的区别
原型:extern void *memcpy(void *dest, void *src, unsigned int count);
用法:#include <string.h>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
注意:.source和destin所指的内存区域可以重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针。
原型:void memmove( void dest, const void* src, size_t count ); //两次拷贝,原到目的,目的再拷回原
头文件:#include<string.h>;
功能:memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。由src所指内存区域复制count个字节到dest所指内存区域。
小结
他们的作用是一样的,唯一的区别是,当内存发生局部重叠的时候,memmove保证拷贝的结果是正确的,memcpy不保证拷贝的结果的正确。但memcpy的效率要比memmove的效率高。
2,strlen 和 sizeof 的区别
(1)sizeof是运算符,strlen是函数
(2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的
(3)strlen 测量的是字符的实际长度,以’\0’ 结束。而sizeof 测量的是字符的分配大小。
(4)strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
(5)sizeof 如果计算类型的大小时要加(),即sizeof(int);如果是变量名可以不加()
(6)数组做sizeof的参数不退化,传递给strlen就退化为指针了。
(7)当使用了于一个结构类型时或变量, sizeof 返回实际的大小,当使用一静态地空间数组, sizeof 归还全部数组的尺寸。
(8)sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
(9)可以用sizeof(arr)/sizeof(arr[0])求数组元素的个数。