【问题标题】:Variables on heap and stack堆和堆栈上的变量
【发布时间】:2013-06-08 01:33:41
【问题描述】:

我一直在寻找这个问题的答案,但对我来说有点棘手。

原来如此!

    int square(int* a){
      return (*a)*(*a)
    }


    int main(){
      int b = 20;  
      square(&b);
    }

我的问题是:变量 a 和 b 存储在哪里?

我认为变量 b 存储在堆栈中,但我对 a 有一些疑问。

当您调用 square(&b) 时,您传递的是引用,在本例中是堆栈中变量 b 的地址。

然后,函数 square(int* a) 接收一个 (int* a) 参数,这意味着它将接收一个指针,在这种情况下,该指针是堆栈中变量 b 的引用。所以变量 a 的值就是变量 b 的地址。但两者都将存储在堆栈中。我很确定它在堆栈上,但是......或者 b 在堆栈中而 a 在堆中?顺便谢谢。

【问题讨论】:

    标签: c variables heap-memory stack-memory


    【解决方案1】:

    b 将在堆栈上。

    当调用square 时,a&b 是相同的值。根据调用约定和编译器优化,该值可能在寄存器中,或在堆栈中,或两者兼而有之。

    【讨论】:

    • 那么......什么情况下可以将 a 存储在堆中?没有?
    • 您使用malloc(或calloc)在堆上分配数据并检索指向该数据的指针。在 C 语言中,这是在堆上结束的唯一方式。
    • 好的,但更具体地说,什么变量会在堆上?它永远不会是ab 变量,对吗?那些总是在堆栈上,对吧?也许 *a 或带有 malloc 的 *b 会在堆上,但同时它们不会在堆栈上吗?
    • 如果你使用void *a = malloc(...),那么分配给*a的内存在堆中,但a将在寄存器或栈中。
    【解决方案2】:

    你是对的! b会被压入栈中,而a只是指向b的指针,所以b的引用和指针a持有的值是同一个值,也就是栈位置的b。但是,指针'a' 在函数调用后不会留在堆栈上——它会超出范围,但'b' 在函数调用后仍会在堆栈上,尽管它的值会发生变化。

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 1970-01-01
      • 2011-04-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 2019-06-15
      • 2021-10-13
      相关资源
      最近更新 更多