【发布时间】:2014-08-08 16:09:28
【问题描述】:
这三个句子对我来说有点混乱。
1.内存是在变量初始化时分配的。
2.在声明变量时分配内存。
3.内存是在定义变量时分配的。
欢迎任何解释!非常感谢
【问题讨论】:
-
你问的是什么语言?
-
#Chuck...这是 C ..对不起! :)
标签: memory
这三个句子对我来说有点混乱。
1.内存是在变量初始化时分配的。
2.在声明变量时分配内存。
3.内存是在定义变量时分配的。
欢迎任何解释!非常感谢
【问题讨论】:
标签: memory
如果是编译语言,我不会说这些。
全局变量在编译时被分配一个内存偏移量,而后者在链接时被设为绝对值。为局部变量分配堆栈帧中的偏移量。
在加载时(当程序从磁盘加载执行时),所有全局变量的内存空间都映射到进程的内存空间,并且变量被隐式地静态分配了一些空间;如果变量已用初始值声明,则在该时刻设置。堆栈空间也被保留。
在运行时,当您输入一个函数时,堆栈帧会被压入堆栈,其中包含局部变量的空间。
在任何情况下,变量都不会单独“分配内存”,初始化、声明和定义都不会在运行时产生任何分配效果。
拍
int g= 1;
void main()
{
int l= 2;
}
第一个变量定义g,在加载程序时,导致加载器映射四个字节的全局空间(除了所有其他全局变量)并初始化为1。第二个变量定义l,导致四个字节(除了所有局部变量)映射到main调用的堆栈帧上,并在进入函数时自动设置为2。
未初始化的变量具有未定义的值,直到您为其分配一些值。这是因为运行时环境只是按原样占用内存空间,以及之前不可预测的内容,以节省初始化成本。
【讨论】:
这很大程度上取决于您使用哪种编程语言,以及该变量在哪里声明。
例如,在 Objective Pascal 中,如果您声明全局应用程序变量,内存管理器将在应用程序启动时为该变量预留内存。
如果你在Objective Pascal中声明了局部变量(变量在方法中声明),当代码进入该方法时,内存将被保留。
当为某个变量保留内存时,该变量不一定会被初始化。它主要取决于变量类型、声明的位置以及您使用的内存管理器。
【讨论】: