C语言:全局变量和局部动态变量,编译后逻辑地址就确定了吗?

看到别人的回答:
“所有的程序都是在运行阶段分配内存,所有变量的逻辑地址都在编译后就确定了,但都是相对的偏移地址,只不过全局变量是相对数据段的偏移,局部变量是相对程序栈顶的偏移。”

请问他说的对吗?
编译后,无论是全局变量还是局部变量,逻辑地址就确定了吗?但分配地址是在程序执行的时候?

1、逻辑地址是确定了,但是物理地址是运行时候决定。
2、在C语言里面,局部变量,全局变量都是存贮在栈(stack)里面的,
而所有用malloc和new这种操作符动态分配的空间则都是存贮在堆(dump)里面的,
举个简单的例子:
int *ptr;
ptr =(int*)malloc(100*sizeof(int));
这两句中,ptr这个指针变量是存贮在栈里面,但是他所指向的内容则是在堆里面。明白了吗
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-23
局部变量是堆栈
例如
{
int a;

}
进入{ } 就push a入栈 就有了a这个变量
出了{ } 就pop a出栈 a这个变量就消失了
所有局部变量的生命周期就就在{ }内

全局变量
在程序运行期间一直存在没错,放在数据区
可是具体装在哪个位置是系统为你分配的
而且不是编译后确定
编译是将c代码转为汇编代码
汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程
汇编后还有链接
编译前还有预编译

全手工打造 希望能帮到你
满意请采纳本回答被网友采纳
第2个回答  2013-02-23
对啊,整个程序运行的地址要在运行时由操作系统来分配的,而逻辑地址则是在编译时就定下了。
第3个回答  2013-02-23
有兴趣你可以看一下操作系统. 这些东西在操作系统原理都有详细解释,这里我可以简单说一下.
操作系统有一项重要的技术就是操作系统虚拟机,它为每一个程序虚拟的一台计算机.这给了程序一个环境,让它觉得整个计算机的资源都是他家的.传统的基于x86架构的32位系统,应用程序都有4G的虚拟内存.操作系统负责虚拟地址到物理地址的映射.至于内存分配,当然是程序员编写程序时就计划好了的,或者编译器帮他规划好了的.不知道这么说你清楚不.

C语言中对一个定义一个变量就是为其在内存中分配一个空间,那个空间最开 ...
c语言中的内存分配从地地址到高地址依次分为程序地址区域、文字常量地址区域、全局变量地址区域、空闲区域(堆)地址区域、栈地址区域、操作系统地址区域。细说那就说来话长了,你可以找找讲C的书,里面一般会讲存储管理。简而言之,一:像全局变量、静态变量这些能在编译时就能确定其内存空间的变量,就...

C语言中变量的地址是什么类型的
如果该变量宣告为char, 程序编译过程会以 1Byte 处理这个变量. 数据就是48(D), 你要说0x30(H)也行. (只是人眼看到的字符不同, 数字的物理意义相同)如果该变量宣告为int, 程序编译过程会接连读取2Bytes做为资料, 这时候就要同时看位置101(D)里面是放什麼.你指的String, 只是告诉编译器, 要怎...

C语言中对一个定义一个变量就是为其在内存中分配一个空间,那个空间最开 ...
③全局区(静态区)(static)-编译器编译时即分配内存。全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放 ④文字常量区 -常量字符串就是放在这里的。 程序结束后由系统释放。⑤程序...

C 采用全局变量解决调用函数参数问题和采用指针解决的区别
对于你个人开发来说,或许全局变量更加方便,但对于团队开发,全局变量是不被推荐的,函数的作用是用于封装一段功能,应该是独立的一段功能函数,过度依赖全局变量,一旦全局变量被意外修改会发生不可意料的错误,而且当你熟练运用指针你会发现它能给你带来许多便利,所以推荐你使用指针 ...

C语言中,变量赋值后被强制修改的原因
变量的地址的某一部分。有时候bug的出现有可能跟代码的关系并不是特别大,bug出现要记录bug出现的环境和测试的用例。在不能实现用户环境和没有测试用例的情况下,这种bug是很难找出或者重现的。所以其实,外人的帮助并不会很大,而是你要通过项目的了解,从而按逻辑来推测,可能出现的原因和位置,然后针对...

全局变量什么时候分配内存
c语言中的全局变量,分为初始化的(int abc=100),和未初始化的(int abcd).初始化的全局变量,在程序加载的时候,会从程序文件中,映射(大部分操作系统,只有第一次使用该地址空间时,才加载到内存中)到内存的数据段。未初始化的全局变量部分,映射到进程地址空间的数据段,Unix中,用到该数据的...

求深信服技术支持笔试题目(赏20分)
1、 extern是C\/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用2、 被extern “C”修饰的变量和函数是按照C语言方式编译和连接的;临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别1、临界区:通过对多...

C语言传值不能传地址吗?
不对,在C语言中,传值有地址传值和参数传值,参数传值只能将实参传值给形参,所以A选项正确。C语言中的外部变量是可以在函数之间传递数据的。C语言中的自动变量是默认的变量,实际上是函数中的局部变量,所以D选项正确。全局变量一经定义都是需要分配内存单元,在程序运行过程中自始至终都会占用固定的...

什么是局部变量什么是整形变量
数控宏程序中的局部变量和整体变量:一 变量 普通加工程序直接用数值指定G代码和移动距离;例如,GO1和X100.0。使用用户宏程序时,数值可以直接指定或用变量指定。当用变量时,变量值可用程序或用MDI面板上的操作改变。 #1=#2+100G01 X#1 F300说明:变量的表示 计算机允许使用变量名,用户宏程序不行...

详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段...
首先,C语言五大内存分区包括:静态内存、动态内存、栈内存、堆内存和文件I\/O内存。静态内存用于存储全局变量和静态变量,动态内存由new和malloc函数分配,栈内存用于函数调用时的局部变量和函数参数,堆内存用于动态分配和管理,文件I\/O内存用于文件读写操作。其次,可执行程序的三段分别为:Text段、Data段...

相似回答