简单的C程序,奇怪的输出

加布里埃尔·S

在这个简单的C程序中,当我注释Line Y并保留Line X原样时,调用的输出将f()输出0Line B输出一些随机数。当我注释Line X和取消注释时Line Y,输出是由于的一些随机数Line B由于的另一个随机数Line Y但是,当我评论Line A和时Line B,两个都调用f()output 0有人可以向我解释为什么会这样吗?先感谢您。顺便说一句,我正在使用gcc没有任何标志,并在macOS Catalina上运行它。

#include <stdio.h>

void f() {
    int x;
    printf("%d\n", x);
}

int main() {
    f();               // Line X
    int a;             // Line A
    printf("%d\n", a); // Line B
    f();               // Line Y
    return 0;
}
约翰·兹温克

执行此操作时:

int x;
printf("%d\n", x);

您正在堆栈上分配空间x,然后打印其值。从理论上讲,该值可以是任何值(您不能期望它为零或任何特定值),但实际上,它将是堆栈上碰巧存在的任何值。

这就是为什么更改周围的代码会更改的值的x原因,因为程序的其他部分会使用堆栈,而更改这些部分会在堆栈中x恰好分配了该空间的地方留下不同的值

x当您更改编译器选项或使用其他计算机时,您可能还会获得不同的值

您可能想知道为什么删除“线A”会更改“线A”之前的“线X”的输出。那是因为编译器可能会main在函数的开头而不是逐行进行所有堆栈分配(例如,它为abefore分配了空间x,因此更改了您在打印时看到的值x,因为它已“向下”移了一个)堆栈上的空间)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

简单的Java程序奇怪的输出

来自分类Dev

C程序的奇怪输出

来自分类Dev

C程序产生奇怪的输出

来自分类Dev

C程序奇怪的输出和错误的输出

来自分类Dev

直方图程序给出奇怪的输出C ++

来自分类Dev

OpenCL C程序提供奇怪的输出

来自分类Dev

简单C程序中没有输出

来自分类Dev

C ++简单的输入/输出程序+枚举器

来自分类Dev

简单程序的c输出错误

来自分类Dev

简单的for循环//但奇怪的输出答案

来自分类Dev

C奇怪而有趣的程序输出

来自分类Dev

为什么C程序使用Scanf给出奇怪的输出?

来自分类Dev

c中的“计算电路的面积和周长”程序...奇怪的输出

来自分类Dev

Netbeans C ++奇怪的输出

来自分类Dev

奇怪的文件输出C ++

来自分类Dev

简单功能中的奇怪输出-Excel VBA

来自分类Dev

Skimage简单读取图像返回奇怪的输出

来自分类Dev

简单printf()产生的奇怪垃圾输出

来自分类Dev

简单的C程序没有给出预期的输出

来自分类Dev

简单的C#输出

来自分类Dev

简单的C#输出

来自分类Dev

格式化程序-显示奇怪的输出

来自分类Dev

Java程序输出奇怪的结果

来自分类Dev

带有后增量的奇怪程序输出

来自分类Dev

C程序尝试使用套接字时输出奇怪的“ ur message”

来自分类Dev

取消简单数字引用时输出奇怪

来自分类Dev

简单的C程序错误

来自分类Dev

简单的C程序演练

来自分类Dev

简单的C ++汇总程序