当您使用C(和其他语言)声明变量时,幕后会发生什么?

时间:2018-07-20 08:51:16

标签: c declaration

我是一位C语言的初学者,我一直认为变量声明的工作方式是,当您声明int x;之类的变量时,您是在告诉编译器为该变量预留内存,如果您随后编写了类似x = 3;的代码,则该代码将被初始化,并且也许编译器可能会在编译时将该声明改编为更有效的地方。

但是最近我读到这不是发生了什么。那么会发生什么,为什么呢?是在幕后发生一些具体的事情,还是声明实际上只是发给编译器的消息,而最终吐出的二进制文件中却没有类似物?以及所有这些如何应用于函数声明?

2 个答案:

答案 0 :(得分:8)

在C标准中的不同“级别”上,这两个语句都是正确的。

C标准的编写主要描述了C实现如何在虚构的抽象计算机内起作用。在此模型中,定义(不只是声明)变量后,将为其保留内存。

但是,C标准指出,实际实现只需要产生结果,就像遵循抽象模型一样即可。该标准规定,抽象模型中只有某些部分必须是可理解的。最值得注意的是,该程序的输出是可观察的。

由于此规则,只要输出和其他可观察到的行为保持不变,编译器就可以按其希望的任何方式更改程序的内部部分。因此,当编译器发现您以某种特定方式使用了某个变量x并且它可以在不为x使用内存的情况下以另一种方式获得相同的结果时,允许编译器更改程序,以便x没有使用实际的内存。

答案 1 :(得分:1)

我认为您的第一段文字还不错,而且一如既往。

我喜欢这样画画,带有标记的小框显示为各种变量预留的内存:

char c = 'A';
int i = 123;
int *ip = &i;

    +---+
 c: | A |
    +---+

    +---------+
 i: |   123   |
    +---------+
         ^
         |
    +----|----+
ip: |    *    |
    +---------+

然后我想到的是确保每个框的内容正确:正确的类型,不会溢出。对于每个指针,我都会考虑那个小箭头是否指向有效的地方。

如果变量是局部变量,则通常将它们存储在堆栈框架中。如果变量是全局变量,则通常将其存储在数据段中。但是,您是对的,它们可能会重新排列,因此您不能指望一个在另一个之前或之后。 (当然,在理智或可移植的程序中也不希望。)

相关问题