2011-03-14 22 views
1

我遇到了一个整数环绕其最小值意外的问题。意外的整数环绕

整数的值为15,然后包装到-858993460。

这是导致该问题的代码:http://codepad.org/tZerX1wC

(在这里,它被复制 - 这是不大)

while(ArrayLocation2 < EmpArray2Size) 
{ 
    GivenEmployees[(*EmployeeSize++)] = curr2; 

    prev2 = curr2; 
    if(ArrayLocation2 < EmpArray2Size) 
    { 
     curr1 = EmpArray2[ArrayLocation2]; 
    } 
    ArrayLocation2++; 

    if((ArrayLocation2 >= EmpArray2Size) || (prev2.HourlyRate > curr2.HourlyRate)) 
    { 
     subFiles++; 
    } 
} 

如果我手动更改它需要的值(16, 17,18等),它按预期工作。

大小声明为“int Size = 21;”并作为&传递到当前的方法,如果它有所作为。

是否有可能得到一个详细的答案,为什么会发生这种情况?

如果需要,我可以提供更多细节。

谢谢。

+0

哪个整数?代码中有很多可能性。每个人如何初始化?你正在研究哪个系统? 0xCCCCCCCC在你的程序或系统中有什么意义? – 2011-03-14 06:27:11

+0

我为代码中的不一致道歉 - 包装的整数是“EmployeeSize”,并按照我在OP中描述的那样进行声明。每次它通过这个方法都会被重置为0,并且每次它增加1,当它达到15时,它会再次增加一次。我正在开发64位Windows 7系统,intel i5。 – Matt 2011-03-14 06:27:55

+0

检查你没有通过任何参考通过它? – deek0146 2011-03-14 06:31:25

回答

1

表达*EmployeeSize++返回值指向EmployeeSize,然后递增指针,而不是指向的项目。尝试(*EmployeeSize)++

+0

非常感谢Geekasaur,这是问题所在。 – Matt 2011-03-14 06:37:01

2

问题是您正在增加指针 - 并且它最终指向随机区域。

你可能打算写:

GivenEmployees[(*EmployeeSize)++] = cur2; 

的括号是必需的位置;原来它们是不必要的。


从评论:

的整数,包装是“EmployeeSize”当我在OP所描述的声明。

(除了它被称为原始OP“尺寸”)。然而,它看起来是:

void this_function(..., int *EmployeeSize, ...) 
{ 
    ...code... 
} 
+0

非常感谢你指出这个简单的错误,我希望我能给你两个答案,但它似乎极客你对抽签乔纳森。 – Matt 2011-03-14 06:36:35

+0

@Matt:实际上,我的时间戳为06:31:46,而Geekosaur的时间戳为06:32:02(所以我的时间是16秒前);答案的呈现顺序是随机的,而它们具有相同的投票计数。 Geekosaur比我更需要分数 - 所以现在不要改变。 – 2011-03-14 07:07:50

0
GivenEmployees[(*EmployeeSize++)] 

闻起来很麻烦。它被解析为

GivenEmployees[(*(EmployeeSize++))] 

后缀增量优先于取消引用。 所以,你增加一个指针然后解引用它。 'EmployeeSize'是一个指向数组的指针吗?