首页 > 解决方案 > C中全局和局部指针变量的内存段分配

问题描述

您能否澄清以下问题。

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

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

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

4)全局指针变量,作用域是什么,怎么用??

标签: c

解决方案


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

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

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

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

脚注

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


推荐阅读