2016-12-15 75 views
0

我真搞不清楚下面的代码的结果:C:未初始化的局部变量呈现意想不到的价值

#include <stdio.h> 
#include <stdlib.h> 

int one(int a, int b) { 
    int k, t; 
    k = a - b; 
    t = a + b + 1; 
    if (k % 2 == 0) return t; 
    else return 0; 
} 

int two(int x, int y) { 
    int m; 
    printf("%d\n", m); 
    return m + x + y; 
} 

main() { 
    int result = two(5, one(4, 3)); 
    // printf("%d\n", one(4, 3)); 
    printf("result is %d\n", result); 
} 

one(4, 3)返回0,这并不奇怪。但我不明白为什么two(5, 0)返回8.换句话说,m取值3,未经初始化。这怎么发生的?

+1

当您使用未初始化的变量时,您会立即被转移到'未定义行为'的领域。不知道会发生什么。 – uptoNoGood

+0

为什么8出乎意料?未初始化的变量允许包含任何值,或者更糟的是,当您尝试访问它时会崩溃。 – immibis

+0

我只是想知道'm'是否是3,因为3在'1(4,3)'中传递。我预计'm'是一些随机值。 – zhuhan

回答

1

定义它们时,C不会自动将值初始化为0。从技术上讲,在初始化数据之前读取这些数据是未定义的行为。实际上,这通常会导致包含先前在该位置存储的任何数据的垃圾值。

+0

是的。但为什么'm'3而不是其他一些随机值?这是3是在“一(4,3)”中传递的论点吗? – zhuhan

+2

@HanZhu可能是因为它重复使用了先前存储了'3'的内存。在某一点。它可能或可能不是那个特定的3. – immibis

+0

全局变量将被初始化为零 –