c - C中全局和局部指针变量的内存段分配
问题描述
您能否澄清以下问题。
1)本地指针的内存段在哪里。例如 p 在哪里int main () { int *p; }
2)全局指针变量的内存位置在哪里?
3)局部指针变量在不同内存段的情况下如何访问全局变量?
4)全局指针变量,作用域是什么,怎么用??
解决方案
1) 最常见的是,C 实现将函数的常规本地对象存储在堆栈上。(C 标准允许实现所需效果的任何实现。1)
2) 最常见的是,C 实现对全局对象使用通用数据段。这样的数据段是由程序加载器根据可执行文件中的信息创建的。可执行文件有多种格式,但它们通常包含具有只读数据的段,具有可在程序中写入但具有初始值的数据的段,以及可写入但初始化为零或也许未初始化。将程序加载到内存中以准备执行的软件读取可执行文件,从操作系统请求内存,并布置所有段。(同样,C 标准允许任何实现所需效果的实现。)
3) 本地指针可以引用全局对象,因为它们在进程内共享一个地址空间。本地和全局对象只是放在地址空间内的不同位置,而不是不同的空间。
4) 全局对象的名称范围是其声明出现的翻译单元,从声明的地方开始,一直延伸到翻译单元的末尾。(翻译单元是一个源文件以及它包含在#include
指令中的任何其他文件。)
脚注
1有些人对不需要堆栈的 C 标准大肆宣传。但是,C 标准确实为函数调用指定了堆栈语义:函数本地对象的行为是后进先出,这是堆栈的行为。由于硬件堆栈提供堆栈数据结构所需的特性,因此符合 C 标准的需求,因此它是实现函数调用及其对象的自然方式。除了优化实际上可能消除本地对象或将它们放入寄存器而不是内存这一事实之外,基本上您唯一会看到没有堆栈的 C 实现是在非常受限的专用环境中。
推荐阅读
- python - 进行python切片和索引时如何修复值错误?
- javascript - 选择其他选择器的值时,如何隐藏选择器?
- java - 如何从 java 后端使用 sudo 执行 shell 脚本?
- lua - 运行资源 es_extended 五M 的调用引用函数时出错
- openshift - 如何通过OC工具查看来自activemq queues/topic的消息
- java - 在后台检测音量键按下
- python - 我试图将列表中的元素转移到另一个列表。我问有多少号码将被转移到列表 b 但显示错误
- sql - Postgres函数获取唯一约束违规
- azure - 我可以过滤从应用中心导出的遥测数据到应用洞察吗?
- r - R 代码在 RStudio 中工作正常,但在终端中不能正常工作 - ODBC SQL - 无法加载安全库:(libgssapi_krb5.dylib)