数组索引爆炸了

时间:2013-07-12 16:42:14

标签: objective-c arrays

我正在Xcode 4.6.3中编写一个iPhone应用程序。

我真的不知道如何提出这个问题,但是在操作过程中,数组索引从0(在方法中硬编码)变为58911由于某种原因。链是:

- (void)syncInitialState
{
    [self syncState:0]; //value starts hardcoded here
}

然后:

- (void)syncState:(int)index
{
    self.state = [macrostate getState:index];
    [self syncState];
}
在Macrostate

- (NPState *)getState:(int)index
{
    int *singleArray = {&index};
    NSPointerArray *pointerArray = [self subsetFromIntArray:singleArray];
    return (__bridge NPState *)[pointerArray pointerAtIndex:0]; //only one object
}

最后:

- (NSPointerArray *)subsetFromIntArray:(int *)intArray
{
    NSPointerArray *subset = [NSPointerArray strongObjectsPointerArray];
    for (int i=0; i<sizeof(intArray); i++) {
        [subset addPointer:[pointerArrayOfStates pointerAtIndex:intArray[i]]]; //fails
    }
    return subset;
}

显然它失败了,因为58911超出了指针数组的范围。我以前从未见过这个。谢谢你的阅读。

可能有助于知道错误是: *由于未捕获的异常'NSRangeException'而终止应用,原因:' - [NSConcretePointerArray pointerAtIndex:] :尝试在索引58911访问指针超出界限4' * *第一掷调用堆栈:(0x1caa012 0x10e7e7e 0x1ca9deb 0xb1c1ab 0xd8ae 0xd7a5 0x47c6 0x485e 0x567f 0x5d95 0x2d3f 0x10d1c7 0x10d232 0x5c3d5 0x5c76f 0x5c905 0x65917 0x29c5 0x29157 0x29747 0x2a94b 0x3bcb5 0x3cbeb 0x2e698 0x1c05df9 0x1c05ad0 0x1c1fbf5 0x1c1f962 0x1c50bb6 0x1c4ff44 0x1c4fe1b 0x2a17a 0x2bffc 0x26fd 0x2625)libc ++ abi.dylib:terminate调用抛出异常

1 个答案:

答案 0 :(得分:3)

您不能使用sizeof来获取int数组的长度。您需要在subsetFromIntArray:方法中添加“长度”参数,然后使用该参数代替sizeof