这段代码发生了什么

调度员

当我编译这段代码时,它每次都会给出随机值,而我无法理解变量“ i”的作用?

 #include<stdio.h>
 int main()
 {
    int j,i=-4,num;
    j=(num<0?0:num*num);
    printf("%d",j);
    return 0;
  }
安德烈亚斯·福斯特(Andreas Fester)

如我们所见,程序中没有使用“ i”,但仍然对程序有影响,而且我知道num未初始化,这就是为什么我想知道其影响和输出的原因

除了num未初始化并因此导致未定义行为(意味着,任何事情都可能发生)的事实之外,您还可以通过分析装配输出来了解技术方面。但是,这是基于C规范的,并且在很大程度上取决于您使用的编译器,底层体系结构和操作系统。

  • 如何i影响程序?

    它没有被使用,因此编译器甚至可能决定完全忽略它。但是,在gcc没有优化的情况下编译代码时,我们看到这会向代码添加一条指令:

    movl    $-4, -12(%rbp)
    

    因此,有两个效果:由于增加了指令,最终的目标代码将略大,并且程序的运行时间将略微增加。如果您使用不同的优化级别,则可能完全不同。

  • Num未初始化,这就是为什么我想知道效果和输出的原因

    对于自动变量,仅分配空间(在堆栈上),但未初始化。由于以前可能使用过相同的内存位置(堆栈),因此这些位置可能有任何内容。因此,输出取决于之前发生的事情,而这是不确定的。由于j是根据进行计算的num,因此的内容j也是不确定的。

  • 为什么当我删除变量时输出会受到影响

    删除变量i可能会影响堆栈上的空间分配(因为需要的空间更少),并且可能导致num重用不同的内存位置,该内存位置可能偶然包含一个常量值而不是一个随机值。但是,这仍然是不确定的,并且会随着编译器,体系结构和平台的变化而变化,并且取决于更早发生的事情。

    对于每个程序调用i,第一个单词始终包含,0x0000而第二个单词不同,可能带有的可能的堆栈布局

     --------
    | 0x0000 |   <= memory location assigned to i (will be initialized to -4 in the next step)
    +--------+
    | 0xnnnn |   <= memory location assigned to num (contains a random value)
     --------
    

    可能的堆栈布局不包含i

     --------
    | 0x0000 |   <= memory location assigned to num (randomly "initialized" to 0x0000 by coincidence)
    +--------+
    | 0xnnnn |   (Unused)
     --------
    

尽管如此,我们观察到的一切仅仅是Undefined Behavior

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

这段Java代码中发生了什么?

来自分类Dev

这段代码中发生了什么?

来自分类Dev

这段代码中发生了什么?

来自分类Dev

这段 perl 代码到底发生了什么?

来自分类Dev

这段代码的每一行发生了什么?

来自分类Dev

这段代码的输出是什么?在第 13 行中到底发生了什么?

来自分类Dev

在swipe.js中,转换功能的这段代码中发生了什么?

来自分类Dev

有人可以解释这段代码中发生了什么吗?

来自分类Dev

弄清楚这段代码发生了什么(递归下降案例研究)

来自分类Dev

这段代码会发生什么?

来自分类Dev

我无法理解这段代码中到底发生了什么。子集功能的最后争论是做什么的?

来自分类Dev

此代码中发生了什么?

来自分类Dev

Flask简介代码中发生了什么?

来自分类Dev

此python代码中发生了什么?

来自分类Dev

此Javascript代码中发生了什么?

来自分类Dev

这个简单的C代码发生了什么?

来自分类Dev

简单的测试代码中发生了什么

来自分类Dev

这个顶点代码中发生了什么?

来自分类Dev

这个 TypeScript 代码片段发生了什么?

来自分类Dev

为什么这段代码是错误的?“重复发生”如何工作?

来自分类Dev

您如何知道JIT编写的代码中发生了什么?

来自分类Dev

代码块变量突出显示...发生了什么事?

来自分类Dev

此Java代码段中到底发生了什么?

来自分类Dev

此scala代码中发生了什么?回调功能

来自分类Dev

代码块变量突出显示...发生了什么事?

来自分类Dev

调用 return 时,此 C 代码中发生了什么?

来自分类Dev

当代码 HashMap(it) 运行时发生了什么?

来自分类Dev

幕后发生了什么,所以代码返回 1 而不是 43?

来自分类Dev

OpenRT发生了什么?

Related 相关文章

热门标签

归档