gpt4 book ai didi

c - 什么时候为c中的变量分配内存?

转载 作者:太空狗 更新时间:2023-10-29 15:45:50 26 4
gpt4 key购买 nike

什么时候为 c 中的变量分配内存?它是否发生在声明或初始化期间?这是否因范围或存储类别而异?

例如:

int i; <<<<<<<< memory gets allocated here?
i=10; <<<<<<<< memory gets allocated here?

我认为,它是在声明过程中分配的。如果我错了请纠正我。

最佳答案

  • 局部函数变量分配在 the stack frame 上并在您调用该函数时进行初始化。
  • 传递给函数的参数要么在堆栈上,要么通过寄存器传递。这取决于您的调用约定。
  • 它们可以在 the heap 上分配, 如果你使用 malloc 和 friend 。
  • static 变量分配在 data section 中如果它们有初始化值 (static int a=1;),否则它们将被隐式清零并分配到 BSS section 中(static int a;)。它们在调用 main 之前被初始化。

至于你的具体例子,

int i;
i = 10;

编译器将在堆栈帧上分配i。它可能会立即设置值。因此它将在进入该范围时对其进行分配和初始化。

举个例子

#include <stdio.h>

int main()
{
int foo;
foo = 123;
printf("%d\n", foo);
}

现在编译它

gcc -O0 a.c -S

这会生成程序集文件 a.s。如果你检查它,你确实会看到 foo 被复制到堆栈框架上:

movl    $123, -4(%rbp)

或者,在 Intel 语法中(将 -masm=intel 添加到 gcc):

mov     DWORD PTR [rbp-4], 123

在它的正下方,您将看到 call printfRBP register指的是栈帧,所以在这种情况下这个变量只存在于栈帧上,因为它只在调用 printf 时使用。

关于c - 什么时候为c中的变量分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29693126/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com