c++逻辑帮助
Help with c++ logic?
Something::methodname()
{
(unsigned char*) ptr = (unsigned char*) m_pptr;
while ((*ptr || *(ptr+1)) && (((unsigned char*)m_pptr+BUFSIZE)<ptr))
ptr++;
if(ptr == m_pptr)
return ptr;
return ptr + 1;
}
m_pptr
是类的受保护成员。ptr
是这个函数的局部
有人能帮我解释一下这段代码的逻辑吗?我知道它会编译,但我得到的答案并不是我所期望的。我正在memset一个充满A5的缓冲区,while循环不知何故失败了。它直接跳过了它。任何帮助都太好了。
这将通过一个缓冲区,如果指针的值或(ptr+1)
的值为真,它将增加指针和ptr不能超过缓冲区的大小(这是由m_pptr
"指向缓冲区开始的指针"+缓冲区大小)也必须为真。if语句表示,如果m_pptr(指向缓冲区开始的指针)与ptr
相同,则只返回指针。
这个函数返回一个void*
并且不传递任何参数
(((unsigned char*)m_pptr+BUFSIZE)<ptr))
看起来落后:
(((unsigned char*)m_pptr+BUFSIZE)>ptr))
更有可能;更理智的:
while (ptr < ((unsigned char*) m_pptr + BUFSIZE)) // until end of buffer
{
if (!*ptr) // null char reached
break;
if (!*(ptr+1)) // null char almost reached
break;
// do stuff
ptr++;
}
我觉得这有点可疑:
while ((*ptr || *(ptr+1))
假设ptr指向一个有效的字符字节,后跟一个NUL结束符字节。
上面一行的第一个子测试将求值为true,因此ptr被加1。现在ptr指向NUL终止字节,*(ptr+1)指向NUL终止字节后的字节…它可能是垃圾/未定义的,因此可能是非零的,此时(ptr)将再次递增(因为这次第二个子测试的值为true),因此ptr现在指向NUL终止字节之后的字节。从那里,你的指针头进入拉拉乐园,试图解释数据,从来没有打算成为字符串的一部分,它正在解析。
如果使用for-loop不是看起来更简洁吗?
for ( int i =0; i<BUFSIZE && (ptr[i] || ptr[i+1]); i++);
这样会更容易发现错误的比较,不是吗?我认为在这个例子中,它应该是
for ( int i =0; i<(BUFSIZE-1) && (ptr[i] || ptr[i+1]); i++);
或者
for ( int i =1; i<BUFSIZE && (ptr[i-1] || ptr[i]); i++);
相关文章:
- 需要帮助设置在C++中使用的Potrace
- 在指针的帮助下,文本文件中单词的频率
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 如何在Qbutton的帮助下更改Q对话框的宽度
- 需要帮助将结构数组传递给函数
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- 有人可以帮助我处理正则表达式吗?
- C++调用具有 *this 属性的单个帮助程序函数
- C++:需要帮助了解运算符重载错误
- 需要以下代码的帮助,下面的代码有什么问题
- CS1 项目帮助C++
- 用于检查值是否为其任何参数的帮助程序函数
- 需要有关此 if 语句的帮助
- 类型限定宏帮助程序
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- NS3 插槽混淆(需要帮助理解)
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 需要帮助查找内存泄漏
- 有人可以帮助我理解这些参数/参数吗?