当我编译这段代码时,它每次都会给出随机值,而我无法理解变量“ i”的作用?
#include<stdio.h>
int main()
{
int j,i=-4,num;
j=(num<0?0:num*num);
printf("%d",j);
return 0;
}
如我们所见,程序中没有使用“ 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] 删除。
我来说两句