Objective C中意外的循环

时间:2011-05-18 12:58:25

标签: objective-c unsigned

我有这段代码:

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循环并持续无限次。

2 个答案:

答案 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说明符,则代码将按原样执行,而不必进入循环。