任何人都可以解释我为什么打印41?

时间:2017-11-12 02:53:16

标签: c scope logic

所以这段程序编译并运行正常。但我不明白为什么要打印出来41.因为变量不是全局的。它们是函数的本地。

为了澄清,我正在用两种不同的方法更改变量名。变量名称相同,与结果无关。

#include<stdio.h>

    void init();
    void _print(); 

    int main(){
        init();
        _print(); 
    }

    void init(){
       int myVar;
       myVar = 41; 
    } 

    void _print(){
       int xyz;
       printf("%d",xyz); 
    }

3 个答案:

答案 0 :(得分:3)

就像你说的,变量是每个函数的本地变量。 42恰好是内存中的值,在_print()函数中分配给myVar。 这是垃圾价值。

答案 1 :(得分:3)

您在这里访问垃圾值。垃圾值结果为41。你下次运行它或有一天你会得到不同的结果。最初位于myVar函数的_print()中的值为41。更确切地说myVar得到的内存包含41。(作为可能原因的解释)之前对init()函数的调用用41初始化变量,当时呼叫结束了,仍然留在内存中。你下次会得到这个价值。

访问未初始化的值是未定义的行为。

答案 2 :(得分:2)

来自C Standards#6.7.9p10

  

如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。

在C语言中,非静态局部变量没有默认值。该变量保存在从堆栈分配变量的存储之前发生在该内存位置的任何垃圾。

您为未初始化的变量41获取的值xyz是垃圾值。