C数组上的奇怪行为

sumofighter666

我遍历NSString数组时发现了非常奇怪的行为。事实是,它仅在iOS 32位环境中发生,但在64位环境下可以正常工作。

这是我运行的代码:

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

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

在实现文件中,我如下循环

- (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

然后应用在NSLog行上抛出EXC_BAD_ACCESS

我可以使用“ for”循环,但事实并非如此

知道为什么会发生吗?这是the的问题吗?

紫罗兰色

该行:

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章