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

C语言中全局和局部指针变量的内存段分配,c,C,你能澄清以下问题吗 1) 其中是本地指针的内存段。e、 g.p位于intmain(){int*p;} 2) 全局指针变量的内存位置在哪里 3) 在内存段不同的情况下,本地指针变量如何访问全局变量 4) 全局指针变量,作用域是什么以及如何使用它???Q1&2)C标准中没有堆栈的概念。此外,存储不同变量类型的位置取决于实现 Q3)本地指针将保存全局变量的地址(如果分配正确)。通过获取该指针的值,可以访问全局变量 Q4)全局变量在整个程序中都有作用域。它们可以从任何地方访问。他们也有整个项目的生命周期

你能澄清以下问题吗

1) 其中是本地指针的内存段。e、 g.p位于
intmain(){int*p;}

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

3) 在内存段不同的情况下,本地指针变量如何访问全局变量

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

Q1&2)C标准中没有堆栈的概念。此外,存储不同变量类型的位置取决于实现

Q3)本地指针将保存全局变量的地址(如果分配正确)。通过获取该指针的值,可以访问全局变量

Q4)全局变量在整个程序中都有作用域。它们可以从任何地方访问。他们也有整个项目的生命周期

1)最常见的是,C实现将函数的常规本地对象存储在堆栈上。(C标准允许实现所需效果的任何实施。1)

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

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

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

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

欢迎访问stackoverflow.com。请花些时间阅读,特别是命名和。也请和。最后,请阅读。这些是家庭作业中的问题或interview@Frankie_C你的观点是什么?这两个问题都不是堆栈溢出的主题。@EricPostPhischil我认为我们在这里不做作业,但这个问题可能会被解释为需要更好的解释。@Frankie_C:“全局”对象的名称范围是声明它的翻译单位(从声明开始,到翻译单元结束)。它不是整个程序。可以在多个翻译单元中声明相同的名称,并通过链接使名称引用相同的对象,但每个实例在不同的翻译单元中具有不同的作用域。虽然C标准没有规定实现如何布局内存以及如何存储对象,使用的方法绝大多数都是通用的,学生学习这些方法以及它们如何影响程序行为是很重要的。对这些问题的回答应该教授这些方法,而不是拒绝基于技术细节的问题。是的,C类指定了一堆激活记录,但没有人说它需要连续内存事实上,C标准也不排除闭包或不同的清理顺序——具有闭包的实现将符合规范。