C:内存中的循环,条件,结构

Roo*_*149 1 c memory struct loops conditional-statements

这个问题可能听起来微不足道但是,我知道每当一个函数开始执行时,堆栈中就会为函数的所有局部变量等创建堆栈帧,但是我无法理解当for循环开始执行或者内部的代码时会发生什么.如果条件开始执行.将它们视为在函数的堆栈框架内执行似乎是不合理的,因为它们有自己的范围,因此它们有自己的局部变量.但是,它们可以访问它们上面的函数的变量,因此这似乎意味着它们位于函数的堆栈框架内.

所以有人可以为我清楚这一点吗?

它们在被执行时实际位于内存中的哪个位置?

同样的问题出现在结构上,它们有自己的范围,它们不是指针,而只是更大的"盒子",包含整数,字符*等.

The*_*ant 5

循环(或任何其他类似块的构造,例如if-else语句)与函数相似.函数是一个自治实体.它本身就是一个完整的计算.当你调用一个函数时,函数的指令,语句和表达式只能访问 - 除了全局变量 - 函数的局部变量和参数(诀窍是参数可以绑定到调用函数的本地变量,它们的地址等) .

但是,循环,if-else或任何其他类型的块是函数的一部分.它不是一个单独的计算单位.它们不是"被称为".它们只是被触及并执行.

块具有范围的事实并不意味着它们需要单独的堆栈帧.输入新范围时,不会创建堆栈框架.调用函数时会创建堆栈帧,因为堆栈与控制流管理有关(例如,帧也需要保存函数的返回地址).

是的,嵌套作用域中变量的分配和销毁可以用堆栈表示,但这不是调用堆栈.这相当于某种"范围堆栈",它纯粹是概念性的.让我用一个例子来证明这一点:

void foo()
{
    int a = 42;       // 'a' is declared and is in scope.
                      // Let's pretend its address is 0x1000.

    {
        int b = 1337; // 'b' is declared and in scope.
                      // Let's pretend its address is 0x1004.
    }

    // here, 'b' is destroyed. Nothing is "popped" out of the stack
    // at runtime – it's merely that the compiler can detect that the
    // name 'b' is not in scope anymore. And hence:

    int c = 0; // it may now reuse the former address of 'b', 0x1004,
               // for storing 'c'.
               // Each of these 3 variables reside within the same stack frame.
}
Run Code Online (Sandbox Code Playgroud)

至于结构:这又是完全不同的东西.如果声明一个struct类型的变量,那么将分配足够大的内存块来按顺序保存结构的所有成员.记忆方面,"没有结构".结构中只有一个成员,一个一个地分配,正确对齐.A struct只是一种抽象.