gpt4 book ai didi

ios - C 数组的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 20:02:40 26 4
gpt4 key购买 nike

我在遍历 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”循环,但事实并非如此

知道为什么会这样吗?是 clang 问题吗?

最佳答案

行:

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)

关于ios - C 数组的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23287515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com