c++中 很多内置方法判断指针长度 都是通过0结尾来判断
譬如一个方法
1 char* CommonMethod::AppendChar(const char* addThis, const char* toThis,int resultSize) 2 { 3 char* result = (char*)malloc(resultSize+1); 4 memset(result,0,resultSize+1); 5 strcpy( result, toThis ); 6 strcat( result, addThis ); 7 return result; 8 }
假若addThis在内存中16进制表现形式为: a8 d2 2c 72 ac 00 fe cb c7 39 d7 59 cb 34 69 33 28 73 f6 fc 00
那么程序就会从第一个00 开始位置进行拼接 从而忽略掉 fe bc c7... 等后面的内容
太多太多这样的例子了 比如strlen(void*) 等等
判断长度都用 0 结尾来判断 而内容中间本身含有0的话 则截取有误 导致最终获取内容有误
我应该怎么做呢? 是在c++避免使用指针 还是有其他好办法?
你需要在传入 addThis 时,同时指定大小,也就是这样定义 AppendChar
char* CommonMethod::AppendChar(const char* addThis,int addSize,const char* toThis,int resultSize)
那么在实现内部,你就不能使用 strcpy strcat 方法,而是替换为 memcpy.
你需要理解以 0 结尾的字符串和不以 0 结尾的字符串的区别.
strlen,strcpy,strcat 这些都是使用的以 0 结尾的字符串.
谢谢 和我后面写的如此一辙
1 void CommonMethod::AppendChar(const char* addThis, const char* toThis,int sizeAdd,int sizeTo,char* result) 2 { 3 result =new char[sizeAdd+sizeTo]; 4 memcpy(result, toThis, sizeTo); 5 memcpy(result+sizeTo, addThis, sizeAdd); 6 7 }
但是我这样写还是有问题 我传一个调用方定义的result到此方法里 给result赋值 但为什么调用方拿到这个result的时候 还是NULL呢
调用方代码:
1 char* result=NULL; 2 CommonMethod method; 3 method.AppendChar(addList,(char*)instr,paddingCount,Filelength,result); 4 //下面使用result的时候 仍旧指向NULL
@果果天涯: 你应该这样写,请区分参数传值和传引用的区别:
CommonMethod::AppendChar(const char* addThis, const char* toThis,int sizeAdd,int sizeTo,char** result)
{
char * p = new char[sizeAdd+sizeTo];
*result = p;
}
@Launcher: 谢谢您的回答
1. 通过0判断的是字符串的结尾,而不是指针指向的内存大小.
2. c++不提供判断内存大小的功能,malloc了多少,由程序员自己记录维护指针和其大小关系。