user-0 提问: 为啥我memcpy后char*的长度变了??

回复:
user: user-1
content: 引用 楼主 luckjava 的回复: #ifndef NDEBUG 	char* pDescMsg = new char[strlen(pMsg)]; 	int iSize1 = strlen(pMsg); // 85 	int iSize2 = strlen(pDescMsg); // 112  	memcpy(pDescMsg, &pMsg, strlen(pMsg));  	int iSize3 = strlen(pDescMsg); // 6 #endif   btw, 用作socket发送的..我new玩能delete吗? memcpy和strcpy2马事

user: user-2
content: 引用 13 楼 zhao4zhong1 的回复:不要用new赵老师，我的问题http://bbs.csdn.net/topics/390695983，求帮助啊。

user: user-3
content: memcpy(pDescMsg, &pMsg, strlen(pMsg)); src错了。

user: user-4
content: void * memcpy ( void * destination, const void * source, size_t num );

user: user-5
content: 话说摩擦起电啊。 快一点使劲一点就是高电平 慢一点轻一点就是低电平？ 哈哈 不懂电平的撸过

user: user-5
content: 引用 13 楼 zhao4zhong1 的回复:不要用new... 不要用C++..不要用C..不要用汇编..直接放电吧，产生些高电平低电平然后程序就跑起来了。 学C++的谁没用过new？学术派。 实践中不一样的。当领导催进度的时候， 去整些什么未定义啊什么的。。。有意思？

user: user-6
content: 不要用new

user: user-7
content: 你这代码问题比较多。 1.pDescMsg未初始化 2.目标字符串空间缺一个字节用来保存结束符(对于字符串来讲，没有结束符是绝对不行的) 3.拷贝字符串最好用sytcpy，不要用memcpy(因为memcpy可能不会正确处理结束符)

user: user-8
content: strlen是以找到‘\0’为止来计算长度的，所以char* pDescMsg = new char[strlen(pMsg)];的时候，pDescMsg尚未初始化，strlen只能找‘\0’来计算长度，所以未初始化得到的长度是随机的。

user: user-9
content: 引用 2 楼 luckjava 的回复:找到原因了... pMsg是char*类型，  memcpy(pDescMsg, &pMsg, strlen(pMsg)); 应该改为：  memcpy(pDescMsg, pMsg, strlen(pMsg));//复制地址了

user: user-10
content: strlen()得出的结果没包含字符串中的结束符，楼主小心内存越界。

user: user-11
content: 引用 9 楼 luckjava 的回复:[quote=引用 8 楼 KenZhang1031 的回复:] 就是因为你没有复制结束符0造成的，因为你申请了pDest2，只按照了字符串长度去申请，它后面的内容是未知的，而你只复制了testtest8个字节，不包含最后的结束符，所以你又把pDest2当成字符串用，大错特错，你要申请strlen(str)+1这么多内存，然后按照strlen(str)+1长度去赋值就不会错了，道理是这样，但是我还是建议你用字符串的函数去处理字符串。 [quote=引用 7 楼 luckjava 的回复:] [quote=引用 6 楼 KenZhang1031 的回复:] memcpy(pDest2, pSrcMsg, strlen(pSrcMsg));只复制了字符，最后的结束符\0没有复制过去， 改为memcpy(pDest2, pSrcMsg, strlen(pSrcMsg) + 1); [quote=引用 4 楼 luckjava 的回复:]  #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？[/quote]   我用memcpy拷贝发到服务器出现了这玩意...什么东东啊?前面都对了，就是后面附带着这些乱码.[/quote][/quote] 谢谢谢谢！我理解一下[/quote] LZ，你真喜欢做死，不做死就不会死啊  char* pDescMsg = new char[strlen(pMsg) + 1];这里要加1啊，不然那个'\0'你准备放哪里？

user: user-0
content: 引用 8 楼 KenZhang1031 的回复:就是因为你没有复制结束符0造成的，因为你申请了pDest2，只按照了字符串长度去申请，它后面的内容是未知的，而你只复制了testtest8个字节，不包含最后的结束符，所以你又把pDest2当成字符串用，大错特错，你要申请strlen(str)+1这么多内存，然后按照strlen(str)+1长度去赋值就不会错了，道理是这样，但是我还是建议你用字符串的函数去处理字符串。 [quote=引用 7 楼 luckjava 的回复:] [quote=引用 6 楼 KenZhang1031 的回复:] memcpy(pDest2, pSrcMsg, strlen(pSrcMsg));只复制了字符，最后的结束符\0没有复制过去， 改为memcpy(pDest2, pSrcMsg, strlen(pSrcMsg) + 1); [quote=引用 4 楼 luckjava 的回复:]  #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？[/quote]   我用memcpy拷贝发到服务器出现了这玩意...什么东东啊?前面都对了，就是后面附带着这些乱码.[/quote][/quote] 谢谢谢谢！我理解一下

user: user-12
content: 就是因为你没有复制结束符0造成的，因为你申请了pDest2，只按照了字符串长度去申请，它后面的内容是未知的，而你只复制了testtest8个字节，不包含最后的结束符，所以你又把pDest2当成字符串用，大错特错，你要申请strlen(str)+1这么多内存，然后按照strlen(str)+1长度去赋值就不会错了，道理是这样，但是我还是建议你用字符串的函数去处理字符串。 引用 7 楼 luckjava 的回复:[quote=引用 6 楼 KenZhang1031 的回复:] memcpy(pDest2, pSrcMsg, strlen(pSrcMsg));只复制了字符，最后的结束符\0没有复制过去， 改为memcpy(pDest2, pSrcMsg, strlen(pSrcMsg) + 1); [quote=引用 4 楼 luckjava 的回复:]  #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？[/quote]   我用memcpy拷贝发到服务器出现了这玩意...什么东东啊?前面都对了，就是后面附带着这些乱码.[/quote]

user: user-0
content: 引用 6 楼 KenZhang1031 的回复:memcpy(pDest2, pSrcMsg, strlen(pSrcMsg));只复制了字符，最后的结束符\0没有复制过去， 改为memcpy(pDest2, pSrcMsg, strlen(pSrcMsg) + 1); [quote=引用 4 楼 luckjava 的回复:]  #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？[/quote]   我用memcpy拷贝发到服务器出现了这玩意...什么东东啊?前面都对了，就是后面附带着这些乱码.

user: user-12
content: memcpy(pDest2, pSrcMsg, strlen(pSrcMsg));只复制了字符，最后的结束符\0没有复制过去， 改为memcpy(pDest2, pSrcMsg, strlen(pSrcMsg) + 1); 引用 4 楼 luckjava 的回复: #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？

user: user-12
content: memcpy一切内存都可以copy，只要不重叠就行，是不是字符串无关紧要。 引用 3 楼 luckjava 的回复:[quote=引用 1 楼 turingo 的回复:] 字符串拷贝用strcpy，用memcpy会有结束符可能弄错的隐患。 strlen(pMsg)不能正确判断字符串长度吗？[/quote]

user: user-0
content: #ifndef NDEBUG 	char* pSrcMsg = "testtest"; 	int iLenSrc = strlen(pSrcMsg);  	char* pDest1 = new char[strlen(pSrcMsg)]; 	pDest1 = strcpy(pDest1, pSrcMsg); 	int iLenDest1 = strlen(pDest1);// len : 8 //	pDest1:	""testtest""  	char* pDest2 = new char[strlen(pSrcMsg)]; 	memcpy(pDest2, pSrcMsg, strlen(pSrcMsg)); 	int iLenDest2 = strlen(pDest2);	// len : 24 //	pDest2: "testtest铪铪"  #endif   这strcpy和memcpy，memcpy怎么出错了？

user: user-0
content: 引用 1 楼 turingo 的回复:字符串拷贝用strcpy，用memcpy会有结束符可能弄错的隐患。 strlen(pMsg)不能正确判断字符串长度吗？

user: user-0
content: 找到原因了... pMsg是char*类型，  memcpy(pDescMsg, &pMsg, strlen(pMsg)); 应该改为：  memcpy(pDescMsg, pMsg, strlen(pMsg));//复制地址了