⑴ C语言中对一个定义一个变量就是为其在内存中分配一个空间,那个空间最开始从哪分配起呢
c语言中的内存分配从地地址到高地址依次分为程序地址区域、文字常量地址区域、全局变量地址区域、空闲区域(堆)地址区域、栈地址区域、操作系统地址区域。细说那就说来话长了,你可以找找讲C的书,里面一般会讲存储管理。
简而言之,
一:像全局变量、静态变量这些能在编译时就能确定其内存空间的变量,就采用静态存储分配分配到全局变量地址区域;
二:栈式存储分配,编译器在编译时仅知道程序变量所需空间,到运行时才为其分配地址的,就分配到栈地址区域;
三:堆式存储分配,堆由大片可利用块或空闲块组成,堆中的内存可以按任意顺序分配和释放。在程序编译无法确定数据块大小时(如可变长度的字符串),可在堆中分配内存空间;C语言在运行时进行的动态内存分配都是在堆中进行的
⑵ c语言中编译系统和操作系统谁为变量分配相应的存储空间
编译系统将程序编译成可执行代码
操作系统执行程序,按照可执行代码需求为程序分配代码空间、常量空间、变量空间、堆栈空间,然后执行程序。
⑶ java程序是在编译的时候分配空间的吗,如果不是那程序在什么时候给变量分配内存空间
编译的时候是不会分配空间的,只是将java代码编译成字节码。是在运行这段代码的时候才会分配。javac XX.java是编译代码,java XX时候是运行代码。举个简单的例子:
class Cs{
int a=1;
public void print(){
System.out.print("a="+a);
}
public static void main(String args[]){
Cs c=new Cs();
c.print();
}}
当你执行到Cs c=new Cs();的时候会初始化变量。将引用变量c放入栈内存,将变量a=1放入堆内存。
⑷ 全局变量在编译时怎么分配空间
关于这个问题,全局变量(成员变量)是在创建对象的时候分配内存的创建对象过程为1分配空间2递归的创建父类对象(无父类这步可省略)3初始化成员变量4调用构造方法创建一个对象
静态变量是在类加载的时候分配空间的,静态变量和对象没有关系是在jvm第一次读到一个类的时候加载信息的过程中分配空间的类加载过程为1加载父类(如果父类已经加载过,则不在加载)2初始化静态属性3按顺序的初始化静态代码块
初始化的前提就是分配空间
而且静态变量在以后的创建对象的时候不在初始化所以一般用静态来保存共享信息
希望对你有所帮助
⑸ (C语言)编译时给全局变量和静态变量分配存储空间,运行时给局部变量分配存储空间,这样说对吗
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
⑹ java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存
全局变量是在创建对象的时候分配内存的 创建对象过程为
分配空间。
递归的创建父类对象。
初始化成员变量。
调用构造方法创建一个对象。
静态变量是在类加载的时候分配空间的,静态变量和对象没有关系 是在JVM第一次读到一个类的时候加载信息的过程中分配空间的 加载过程为
1 .加载父类(如果父类已经加载过,则不在加载)。
2.初始化静态属性 。
3 .按顺序的初始化静态代码块 初始化的前提就是分配空间 。
而且静态变量在以后的创建对象的时候不在初始化 所以一般用静态来保存共享信息