C数组上的奇怪行为

时间:2014-04-25 08:05:04

标签: ios objective-c arrays

我在循环遍历NSString数组时发现了非常奇怪的行为。事情是它只在iOS 32位环境中发生,但在64位上按预期工作。

这是我运行的代码:

static NSString * const HexColors[3] = {
    @"FFFFFF",
    @"FF0000",
    @"000000"};

static NSString * const ColorDescription[3] = {
    @"white",
    @"red",
    @"black"};

在实现文件I中循环如下

- (void)loop {
    NSInteger i = 0;
    while (HexColors[i]) {
        NSLog(@"%@", HexColors[i]);
        i++;
    }
}

我得到的结果:

2014-04-25 09:57:45.374 loopApp[587:60b] FFFFFF
2014-04-25 09:57:45.375 loopApp[587:60b] FF0000
2014-04-25 09:57:45.376 loopApp[587:60b] 000000
2014-04-25 09:57:45.376 loopApp[587:60b] white
2014-04-25 09:57:45.377 loopApp[587:60b] red
2014-04-25 09:57:45.377 loopApp[587:60b] black

然后app在NSLog行上抛出EXC_BAD_ACCESS

我可以使用"用于"循环,但事实并非如此

知道为什么会这样吗?这是铿锵声吗?

2 个答案:

答案 0 :(得分:2)

该行:

while (HexColors[i]) ...
如果那里有一些NULL标记,

只会停在数组的末尾,所以你有几个选项(至少)。

首先,你可以在那里放置一个NULL标记,用:

static NSString * const HexColors[] = {
    @"FFFFFF",
    @"FF0000",
    @"000000",
    NULL};

还要注意不确定的数组大小[],它根据数据本身创建一个数组。当您提供所有数据并且在添加项目时不希望更改太多时,这通常是首选。

第二个(不添加NULL元素),您可以使用更好的测试来限制循环:

for (i = 0; i < sizeof (HexColors) / sizeof (*HexColors); i++) ...

表达式sizeof (HexColors) / sizeof (*HexColors)为您提供HexColors中的数组元素数。


顺便说一下,你看到两个数组输出的原因是因为它们在内存中的布局。 ColorDescription数组紧跟在HexColors之后,所以就好像根据你的略微错误的循环只是一个数组。

然后,ColorDescription之后是指针(或任意值被解释为指针),导致内存错误。

                 +---------+
HexColors        | pointer | --> "FFFFFF" (all nul-terminated
                 | pointer | --> "FF0000"  character arrays)
                 | pointer | --> "000000"
                 +---------+
ColorDescription | pointer | --> "white"  (ditto)
                 | pointer | --> "red"
                 | pointer | --> "black"
                 +---------+
ArbitraryMemory  | ??????? | --> ???????  (except here, which
                 +---------+               could be anything)

答案 1 :(得分:1)

更改while (HexColors[i])条件。

 while (i < arrayCount)

避免index 3 beyond bounds