C 有人能解释一下为什么会打印41吗?

C 有人能解释一下为什么会打印41吗?,c,scope,logic,C,Scope,Logic,因此,这段程序编译并运行良好。但我不明白为什么要打印出来。因为变量不是全局的。它们是函数的局部 为了澄清,我在两个不同的方法中更改变量名。变量名相同与结果无关 #include<stdio.h> void init(); void _print(); int main(){ init(); _print(); } void init(){ int myVar; myVar =

因此,这段程序编译并运行良好。但我不明白为什么要打印出来。因为变量不是全局的。它们是函数的局部

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

#include<stdio.h>

    void init();
    void _print(); 

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

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

    void _print(){
       int xyz;
       printf("%d",xyz); 
    }
#包括
void init();
void_print();
int main(){
init();
_打印();
}
void init(){
int-myVar;
myVar=41;
} 
作废(打印){
int-xyz;
printf(“%d”,xyz);
}

正如您所说,变量是每个函数的局部变量。42恰好是内存中分配给_print()函数中myVar的值。
这是垃圾价值

这里您正在访问垃圾值。垃圾值原来是
41
。下次或某一天运行时,可能会得到不同的结果。
\u print()
函数的
myVar
中最初的值是
41
。更准确地说,
myVar
获得的内存段包含
41
(作为可能原因的解释)对
init()
函数的上一次调用使用
41
初始化了一个变量,当该调用结束时,41仍然保留在内存中。下次你会得到这个值

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

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

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


对于未初始化变量
xyz
得到的值
41
是垃圾值。

即使我用两种不同的方法更改变量的名称。它最终还是打印了41页。我不明白为什么void init(){int myVar;myVar=41;}void_print(){int Var;printf(“%d”,Var);}是的。这不一定意味着什么。很确定这与堆和堆栈的使用有关。此外,您应该以不同的方式使用_print()方法中的“myVar”。我记得我的教授以前总是强调C中的变量必须初始化,否则它们往往会在未定义的位置读取。在本例中,由于代码很小,它看起来像是第一个变量。您还可以通过更改第一个值的类型来测试它,这样仍然可以获得一致性results@metadata.:是的,它只是一些垃圾值。您可以多次运行它或执行任何操作,但并非每次都会得到相同的结果。访问未初始化的值是未定义的行为。如果它是随机的,则每次都会得到不同的值,但不会。这是一致的,这就是我的观点,我没有得到随机值,如果我把41改成78,它会打印出78,即使我在两个不同的函数中使变量名不同。它仍然从init函数输出值。谢谢。”CordReDoc,我认为现在是有意义的。@ MatthyurayaynuDufftIt:如果我们认为调用函数是使用堆栈框架实现的,那么对函数的第一次调用就将一个值为41的堆栈帧分配给变量。然后它被弹出。然后再次使用相同数量的局部变量调用函数,但内存中仍然包含previosu 41值。这就是为什么它会得到它。我会稍微看看头和堆栈内存分配以及它们是如何工作的。我没有足够的知识给出一个明确的答案,但基本上,因为第二个变量是初始化的,它指向第一个变量并读取第一个变量的值。如果你用不同的方式命名变量或改变类型,你仍然会得到一致的结果(这里没有随机的东西或“魔法”)。如果您使用valgrind检查程序,它将显示您在执行程序时出错。我将在@MatthieuRaynauddeFitte执行此操作。谢谢