我有这段代码:
unsigned int k=(len - sizeof(MSG_INFO));
NSLog(@"%d",k);
for( unsigned int ix = 0; ix < k; ix++)
{
m_pOutPacket->m_buffer[ix] = (char)(pbuf[ix + sizeof(MSG_INFO)]);
}
问题在于:
len = 0 and sizeof(MSG_INFO)=68;
k=-68;
这个条件进入for循环并持续无限次。
答案 0 :(得分:5)
您的代码说:unsigned int k
。所以k不是-68,它是unsigned
。这使得ka非常大,基于a 4 byte int,它将是4294967210.这显然远远超过0,所以它会花费你的for
循环一段时间才能达到那么高,尽管它最终会终止。
你认为它是-86的原因是当你用NSLog
这样的函数打印它时,它没有直接了解传入的参数,它决定了如何处理参数,基于格式字符串,作为第一个参数提供。
NSLog(@"%d",k);
这告诉NSLog
将参数视为signed int (%d)
。你应该这样做:
NSLog(@"%u",k);
因此NSLog将参数视为它的类型:unsigned (%u)
。 See the NSLog documentation.
就目前而言,我希望你的缓冲区溢出,在循环运行时丢失内存,你的应用程序崩溃。
经过反思,我相信@FreeAsInBeer是正确的,你不想在这种情况下迭代for循环,你可以通过使用signed int来解决这个问题。然而,在我看来,你会更好,检查len > sizeof(MSG_INFO)
,如果不是这样,处理它的方式不同。我能想到的大多数情况,如果我没有为消息读取足够的信息,我不想在for循环后执行任何处理......
答案 1 :(得分:0)
我不确定这里发生了什么,因为循环永远不会执行。我已经加载了您的代码,似乎unsigned
声明的int
部分导致了问题。如果删除了两个unsigned
说明符,则代码将按原样执行,而不必进入循环。