为什么这个局部变量的值会发生变化?

时间:2012-11-30 06:17:34

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

考虑以下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

4 个答案:

答案 0 :(得分:3)

那是垃圾值。

用一些值初始化它。

编辑:

存储类说明符的默认值为

表示自动垃圾价值。

表示静态 - 。

表示global / extern-0;

用于寄存器垃圾。

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

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

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

你正确地指出了这个链接,现在没有必要在这个答案中解释。我该怎么办才能参考该链接。

How does an uninitiliazed variable get a garbage value?

答案 1 :(得分:1)

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

答案 2 :(得分:1)

除非您初始化本地自动变量,否则不会初始化它们。不能假设它们具有任何特定价值。实例变量,静态变量和全局变量初始化为0,但不是像这样的普通本地变量。在打算读取其值

之前,您需要自己初始化它

答案 3 :(得分:0)

在堆栈上声明值不会初始化它。它只是为它分配空间。无论在记忆中发生什么价值,你都会看到印刷的价值。如果您改为写道:

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

然后每次都应该打印0。