“C”语句如何在内存中执行

时间:2016-03-02 08:14:13

标签: c statements

假设我在这里有一段 C 代码:

int main() {           
    int a = 10;
    printf("test1");
    printf("test2");
    someFunc();
    a = 20;
    printf("%d",a);
} 

我认为所有这些语句一次存储在堆栈中,然后一个接一个地弹出来执行。我对么?如果没有,请纠正我。

3 个答案:

答案 0 :(得分:6)

不是真的没有。 C标准没有提到堆栈,所以你的想法是错误的。

只要符合C标准,C编译器(或解释器)可以做任何喜欢的事情。

在你的情况下,除其他外,这可能意味着(i)完全删除a,因为它仅用于在功能结束时输出20,以及(ii)如果这样做没有副作用,可以删除someFunc()

正常发生的是您的代码转换为适合目标架构的机器代码。这些机器代码指令确实倾向于非常忠实地遵循代码(C在这个意义上是相当低的#34;低级别")尽管现代编译器会积极地进行优化。

答案 1 :(得分:2)

C标准没有规定记忆中的内容。

但是,计算机的工作原理如下:

  • 您的程序包含各种内存部分/细分,通常称为.data.bss.rodata.stack.text,并且可能也是.heap.text部分用于存储实际的程序代码,其余部分用于存储变量。 More info on Wikipedia
  • 编译器将C代码转换为机器代码(汇编程序)。所有代码都存储在.text部分内,该部分是只读内存。
  • 现代计算机可以"标记"内存作为代码或数据,如果您尝试在数据部分执行代码,或者将代码部分视为数据,则能够生成硬件异常。通过这种方式,处理器可以帮助捕获诸如悬空指针或失控代码之类的错误。
  • 理论上,您可以从任何内存部分执行代码,甚至可以在堆栈上执行代码,但由于前面提到的功能,通常不会这样做。大多数情况下,无论如何这样做都没有任何意义。

因此,对于特定的代码段,存储在堆栈中的唯一内容是变量a。或者更可能的是,出于性能原因,它存储在CPU寄存器中。

字符串文字"test1""test2""%d"将存储在.rodata部分。

文字20可以存储在.rodata部分中,或者更有可能合并到代码中,因此与其余代码一起存储在.text中。

程序计数器确定当前执行的代码部分。堆栈不涉及那么多,它只用于存储数据。

答案 2 :(得分:1)

值得注意的是,C标准没有强制要求实施。因此,只要输出根据标准是正确的,编译器就可以自由选择实现它。

最有可能发生的事情是编译器将此C位转换为汇编代码,然后从上到下执行。

a = 20;

除非您在其他地方使用它,否则最有可能进行优化。好的编译器也会给你一个警告:

  

警告:未使用的变量a