C中全局和局部指针变量的内存段分配

时间:2019-07-31 10:54:56

标签: c

能否请您澄清以下问题。

1)本地指针的存储段在哪里。例如p在int main () { int *p; }

中的位置

2)全局指针变量的存储位置在哪里?

3)如果内存段不同,局部指针变量如何访问全局变量?

4)全局指针变量,作用域是什么,如何使用它?

2 个答案:

答案 0 :(得分:1)

1)最常见的是,C实现将功能的常规局部对象存储在堆栈中。 (C标准允许实现所需效果的任何实现。 1

2)最常见的是,C实现将通用数据段用于全局对象。这些数据段是由程序加载器根据可执行文件中的信息创建的。可执行文件有多种格式,但是它们通常包含具有只读数据的段,具有可在程序中写入但具有初始值的数据的段以及具有可写入但已初始化为零或零的数据的段。可能尚未初始化。将程序加载到内存中以准备执行的软件将读取可执行文件,从操作系统请求内存,并对所有段进行布局。 (同样,C标准允许实现所需效果的任何实现。)

3)局部指针可以引用全局对象,因为它们在进程内共享单个地址空间。局部和全局对象仅放置在地址空间内的不同位置,而不是不同的空间。

4)全局对象名称的范围是其声明出现在其中的翻译单元,从声明它的位置开始,一直延伸到翻译单元的末尾。 (翻译单元是源文件以及它包含在#include指令中的所有其他文件。)

脚注

1 有些人制作了C标准的Hullabaloo,不需要堆栈。但是,C标准确实为函数调用指定了栈语义:函数本地对象的行为是后进先出,即栈的行为。由于硬件堆栈提供了堆栈数据结构的必需功能,因此符合C标准的需求,因此这是实现函数调用及其对象的自然方法。除了优化实际上可以消除局部对象或将其放入寄存器而不是内存之外,基本上,您唯一会看到没有堆栈的C实现是在非常受限的专用环境中。

答案 1 :(得分:0)

Q1和2)在C标准中没有 stack 的概念。另外,存储不同变量类型的位置是与实现有关的

Q3)局部指针将保存全局变量的地址(如果分配正确)。使用此指针的值,您可以访问全局变量。

Q4)全局变量在整个程序中都有范围。可以从任何地方访问它们。它们还具有整个程序的生命周期。