点滴也是积累,海纳百川啊。
1、memcpy和strncpy的区别。//我都不知道memcpy是啥咋知道区别。坑爹啊。
首先,它俩都是在csting头文件里,显然是从C遗传过来的。
其次,看下各自的函数原型:
void* memcpy(void* dest,const void* src,size_t n);
char* strncpy(char* dest, const char* src,size_t n);
strncpy有点象阉割版的memcpy啊。呵呵。
最明显的区别,前者是操作内存的,复制源、复制目的地只要是可以读写的内存空间就行;而后者只能操作字符数组(串)。
第三,也是由上一点的区别衍生过来的。就是memcpy会复制满n个,而strncpy遇到'\0'会停止复制,之后的全部设置为'\0',直到总共n个(而strcpy遇到0就停止了,没有个数限制。)。这一点也好理解,毕竟str是操作字符串的,遇0停止很正常。
多说一点:
str系列就是为了操作字符数组或者说c字符串的。如果中间出现了0,是一定会停止的。而mem系列是操作内存的,所以不管什么字符,一律拷贝就好。如果源串比目标串长,目标串就会溢出,发生什么无法确定,当然也可能什么都不发生。
而strncpy和memcpy中n小于源串的长度时,要记得自己手动将目标串的最后一位设置成0,否则串没有结束标识显示的时候就是乱码了。
一点测试:
char strsrc[5] = {'a','b','\0','c','\0'};
char strdest1[10];
char strdest2[2];
char strdest3[10];
memset(strdest1,0x38,sizeof(strdest1));
memset(strdest2,0x38,sizeof(strdest2));
memset(strdest3,0x38,sizeof(strdest3));
memcpy(strdest1,strsrc,8);
strcpy(strdest2,strsrc);
char temp = *(strdest2+2);
strncpy(strdest3,strsrc,8);
结果就是
strdest1前五个字符完全拷贝,中间3个都是?后两个是8,
strdest2的两个字符是a、b,
temp是0,说明strcpy拷贝的终止条件是源串出现0,
strdest3前两个字符是a、b,中间7个是0,后面两个是8.
2、关于sizeof()
void Func(char a[100])
{
cout<<sizeof(a)<<endl;//4字节而不是100字节。因为数组在作为参数传递时,自动退化为同类型的指针!!
}