昨天我接受采访时面试官问我存储变量的存储类.
我的回答是战争:
Local Variables are stored in Stack.
Register variables are stored in Register
Global & static variables are stored in data segment.
The memory created dynamically are stored in Heap.
Run Code Online (Sandbox Code Playgroud)
他问我的下一个问题是:他们为什么要存储在那些特定的记忆区域?为什么Local variable 没有存储register(虽然我需要auto在我的程序中经常使用变量)?或者为什么not要存储全局变量或静态变量stack?
然后我一无所知.请帮我.
Alo*_*ave 16
因为存储区域决定了变量的范围和生命周期.
您可以根据需要选择存储规范,即:
生命周期:您期望特定变量需要存活且有效的持续时间.
范围:您希望变量可访问的范围(区域).
简而言之,每个存储区域提供不同的功能,您需要各种功能,因此需要不同的存储区域.
bdo*_*lan 12
实际上,C语言没有定义任何变量的存储位置.但是,它确实定义了三个存储类:静态,自动和动态.
静态变量在程序初始化期间(之前main())创建,并保持存在直到程序终止.文件范围('全局')和静态变量属于该类别.虽然这些通常存储在数据段中,但C标准并不要求这种情况,并且在某些情况下(例如,C解释器),它们可以存储在其他位置,例如堆.
自动变量是在函数体中声明的局部变量.它们是在程序流到达声明时或之前创建的,并在它们超出范围时被销毁; 为递归函数调用创建了这些变量的新实例.堆栈是实现这些变量的便捷方式,但同样,它不是必需的.如果你选择的话,你也可以在堆中实现自动化,并且它们通常也放在寄存器中.在许多情况下,自动变量将在其生命周期内在堆栈和堆之间移动.
请注意,register自动变量的注释是一个提示 - 编译器没有义务对它做任何事情,事实上许多现代编译器完全忽略它.
最后,动态对象(不存在这样的事情在C的动态变量)指的是使用显式地创建值malloc,calloc或其他类似的分配的功能.它们在显式创建时存在,并在显式释放时被销毁.堆是放置这些的一个方便的地方 - 或者更确切地说,一个基于执行这种分配方式的能力来定义堆.但同样,编译器实现可以随意做任何事情.如果编译器可以执行静态分析来确定动态对象的生命周期,则可能能够将其移动到数据段或堆栈(但是,很少有C编译器执行此类"转义分析").
这里的关键外卖是,C语言标准只定义了多久,一个给定的值是存在了.并且在此生命周期的最小界限 - 它可能比所需的更长.究竟如何将它放在内存中是一个主题,语言和库的实现给予了很大的自由.