【问题标题】:Why is this local variable's value changing?为什么这个局部变量的值会发生变化?
【发布时间】:2012-11-18 08:48:35
【问题描述】:

考虑以下 Objective-C 代码:

@interface ClassA : NSObject {

}
-(void) printVal;
@end


@implementation ClassA
-(void) printVal {
    int val;
    NSLog(@"%i", val);
}
@end


int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    ClassA* cA = [[ClassA alloc] init];
    [cA printVal];
    [cA printVal];
    [cA printVal];

    [pool drain];
    return 0;
}

为什么会这样输出:

2012-11-29 22:12:06.586 TestOne[20266:903] 0
2012-11-29 22:12:06.587 TestOne[20266:903] 32767
2012-11-29 22:12:06.588 TestOne[20266:903] 32767

也就是说,为什么val在重新声明的时候没有重新初始化为0,为什么后续每次调用方法都会收到32767的值?

【问题讨论】:

  • 这不是一个 Objective-C 问题。这是一道C题。 Objective-C 是 C(一个经常被遗忘的事实)...考虑阅读 K&R;这是一本很棒的书。
  • @matt,我想可能是这样,但我对 C 的了解甚至比对 Obj-C 的了解还要多。在问题中添加了“c”标签。

标签: objective-c c initialization declaration default-value


【解决方案1】:

那是垃圾值。

用一些值初始化它。

编辑:

存储类说明符有一些默认值

用于自动垃圾值。

对于静态- 0。

for global/extern- 0;

用于注册垃圾。

在你的情况下它是自动的。

啊啊啊!!!我不想回答你的第二部分:(

为什么最初是 0,后来是 32767。

您在该链接中正确指出,现在无需在此答案中解释。我能做的只是参考那个链接。

How does an uninitiliazed variable get a garbage value?

【讨论】:

  • 对不起。不明白您所说的垃圾值是什么意思,但是在重新阅读时,我认为这可以回答问题。你有更多关于你在哪里了解垃圾值的详细信息吗?只是好奇。
  • 参考任何 c 或 c++ 书籍,它是重要的主题之一。您经常在面试和源代码中被要求解决并找到考试的结果。
  • 并且,刚刚发现:stackoverflow.com/questions/1422729/… 然而,我很仓促地接受了你的回答——为什么第二次调用该方法用垃圾值填充未初始化的变量,而它包含 0第一次调用该方法?
【解决方案2】:

在 Objective-C 中,the only guarantee you have is that an int will be at least 32-bits wide。这也许可以解释为什么它不是 0。至于为什么它是 32767,我没有最模糊的,但 32768 是 2 的幂,所以这可能是答案的线索。

【讨论】:

  • 我现在明白必须初始化局部变量。所以,除此之外,我想我的问题基本上属于琐事领域。尽管如此,我还是很好奇这个值会因为它曾经被访问过而改变。
【解决方案3】:

除非您初始化局部自动变量,否则它们不会被初始化。不能假定它们具有任何特定价值。实例变量、静态变量和全局变量都初始化为0,但不是像这样的普通局部变量。在你打算读取它的值之前,你需要自己初始化它

【讨论】:

    【解决方案4】:

    在堆栈上声明一个值不会初始化它。它只是为它分配空间。该内存中发生的任何值都是您将看到的打印值。如果你改为写:

    -(void)printVal
    {
        int val = 0;
        NSLog (@"%i", val);
    }
    

    那么它应该每次都打印 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多