繁体   English   中英

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

[英]C: Loops, conditions, structs in memory

这个问题听起来很琐碎,但是,我知道每当一个函数开始执行时,都会在堆栈中为该函数的所有局部变量创建一个堆栈框架,但是我无法理解,当for循环开始执行时,或者内部的代码发生了什么如果条件开始执行。 将它们视为在函数的堆栈框架内执行似乎是不合理的,因为它们具有自己的作用域,因此也具有自己的局部变量。 但是,它们可以访问它们上面的函数的变量,因此这似乎暗示它们在函数的堆栈框架内。

那么有人可以帮我解决这个问题吗?

它们在执行时实际位于内存中的什么位置?

对于结构,也会出现同样的问题,它们具有自己的作用域,它们不是指针,而只是包含整数,char * s等的更大的“盒子”。

循环(或任何其他类似块的构造,例如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.
}

至于结构:再次完全不同。 如果声明结构类型的变量,则将分配足够大的内存以按顺序容纳结构的所有成员。 在内存方面,“没有结构”。 只有结构的成员 ,它们被一一分配,并正确对齐。 struct只是一个抽象。

实际上,该变量存在于函数的主堆栈框架中。 您只是不能在声明它的子块之外的任何地方引用它。 并不是每次循环都会不断创建和销毁变量。 因此,更多的问题是编译器允许您通过其名称而不是其实际存在来引用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM