计算机如何给数组分配内存,有何要求?

2024-12-15 15:34:22
推荐回答(2个)
回答1:

第一个问题:int [] test = new test[100];我知道在堆中分配了100个单元的内存空间,但是在栈中存储的是堆中的地址,问栈中分配了几个单元的内存空间来存地址呢?我自己查了下栈中好像是只保存了堆中100个单元的首地址,不大确定,求解?还有就是如果栈中只分配了一个单元存储堆中首地址的话,那我们test[10]这样查数组中的某个元素怎么定位的,是到堆中遍历数组吗?第二个问题:A [] test = new A[100];A是一个类,网上是这么说的:会先在托管堆为test分配一次空间,并且这时不会自动初始化任何元素(即test[i]均为null)。等到以后有代码初始化某个元素的时候(A[0]=new A();),这个引用类型元素的存储空间才会被分配在托管堆上。我想问的是"先在托管堆为test分配一次空间",这句话是什么意思,它分配了100个单位的内存空间吗?但后面A[0] = new A();进行实例化时,它才分配了真正存储数据的单元,但开始分配的100个单元的空间有什么用呢?首先,如果你声明的是值类型的数组,那么CLR分配内存时在堆中一次性分配足够的内存空间,每个单元应该是所存储类型的两倍左右的容量,也就是200份int 类型的内存。该数据是已值方式存储的。如果是引用类型的话会创建100分的地址存储引用空间,只是在没初始化数组中具体值的时候都每个单元都存储的是null引用,这个引用是4个字节长,当你对数组中某项初始化的时候,系统再次动态在堆中分配内存,并在这个数组项中存储新分配内存的引用。原则:1、简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)2、引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上)class Person{} Person[] myPerson;myPerson = new Person[2];myPerson[0] = new Person;myPerson[1] = new Person;Persons是一个变量,它是一个可以容纳两个引用空间的内存块,因为数组在声明定义的时候是能够知道元素个数的,所以在堆栈上分配的内存空间是预先可以知道的(这里的堆栈简化理解可以理解成为栈,在C++中由系统管理内存,堆内存的管理是人工的C++中)两个引用实际上就是两个指针变量,在32位机中,myPerson变量就是64字节(2*32)两个指针变量的内存空间,这64字节的内存空间名字命名为myPerson 第一个问题:int [] test = new test[100];我知道在堆中分配了100个单元的内存空间,但是在栈中存储的是堆中的地址,问栈中分配了几个单元的内存空间来存地址呢?我自己查了下栈中好像是只保存了堆中100个单元的首地址,不大确定,求解?还有就是如果栈中只分配了一个单元存储堆中首地址的话,那我们test[10]这样查数组中的某个元素怎么定位的,是到堆中遍历数组吗?第二个问题:A [] test = new A[100];A是一个类,网上是这么说的:会先在托管堆为test分配一次空间,并且这时不会自动初始化任何元素(即test[i]均为null)。等到以后有代码初始化某个元素的时候(A[0]=new A();),这个引用类型元素的存储空间才会被分配在托管堆上。我想问的是"先在托管堆为test分配一次空间",这句话是什么意思,它分配了100个单位的内存空间吗?但后面A[0] = new A();进行实例化时,它才分配了真正存储数据的单元,但开始分配的100个单元的空间有什么用呢?首先,如果你声明的是值类型的数组,那么CLR分配内存时在堆中一次性分配足够的内存空间,每个单元应该是所存储类型的两倍左右的容量,也就是200份int 类型的内存。该数据是已值方式存储的。如果是引用类型的话会创建100分的地址存储引用空间,只是在没初始化数组中具体值的时候都每个单元都存储的是null引用,这个引用是4个字节长,当你对数组中某项初始化的时候,系统再次动态在堆中分配内存,并在这个数组项中存储新分配内存的引用。原则:1、简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)2、引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上)class Person{} Person[] myPerson;myPerson = new Person[2];myPerson[0] = new Person;myPerson[1] = new Person;Persons是一个变量,它是一个可以容纳两个引用空间的内存空间,这64字节的内存空间名字命名为myPerson。

回答2:

刚开始学C语言不久,还不是很扎实。

记得好像是用stdlib.h头文件里面的malloc()和free()函数实现内存的动态分配和释放?