我假设你在某个函数中,因为你正在调用函数等。
test
两者的空间都x
分配在堆栈上。理论上,这些家伙的空间在他们的值被填充之前应该存在。如果我们查看生成的程序集(x86 gcc),这是真的。
subl $40, %esp # Add 40 bytes of memory to the current stack
movl $0, -20(%ebp) # Clear test[0] to 0
movl $0, -16(%ebp) # Clear test[1] to 0
movl $45, -20(%ebp) # Place the value of 45 into test[0]
movl -20(%ebp), %eax # Copy that 45 into a register
movl %eax, -16(%ebp) # Move that register's value (45) into test[1]
movl $111, -12(%ebp) # Assign x to be 111, optimize out the unnecessary duplicate assignment
... #continues on to set up and call printf
我们可以看到堆栈中添加了 40 个字节。请注意 test[0]、test[1] 和 x 的地址是如何%ebp
以 4 字节间隔(分别为 -20、-16、-12)标记的连续地址。它们在内存中的位置是存在的,并且在定义之前可以无错误地访问。此处的编译器将它们都清除为 0,尽管我们可以看到这是不必要的。您可以删除这两行并且仍然可以正常运行。
我们可以从中得出的结论是,您的int test[2]和int x内部可以有任意数量的时髦循环引用,并且代码将编译——您的工作就是确保您的引用获取良好的数据(即以某种方式初始化数据) 而不是垃圾,你在这里所做的。这也适用于其他情况 - 编译为程序集并自己检查它是如何完成的。