⑴ c语言问题:内存的分配方式有哪几种
1、静态存储区分配
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。
2、栈上分配
在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。
3、堆上分配
堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。
(1)数组的存储单元分配扩展阅读
栈上分配数组
#include<iostream>
usingnamespacestd;
voidmain()
{
int**arr=NULL;//int型二维数组
introws,columns;
cin>>rows;//2
cin>>columns;//3
//请在此处编写代码,根据rows和columns在栈上分配一个数组arr
...你的代码...
//赋值给数组元素
for(introwIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;
}
}
//打印每个数组元素
for(rowIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
printf("%d",arr[rowIndex][columnIndex]);
}
printf(" ");
}
}
⑵ 什么是数组数组元素与存储单元的对应关系是怎样的
数组就是存储一堆数据的存储结构。(可是是整数,可以是字母,甚至,多元数组还可以存储字符串)
数组里的元素是连续的。所以相邻的存储单元的存储地址是连着的。
这也是后面为什么指针可以来代替数组处理问题的原因。
比如a[0]和a[1]的存储单元地址是连续的
⑶ 给出下列数据定义伪指令的存储单元分配情况ARRAY1 DB 5 DUP(),‘...
定义了数组
ARRAY1
5个空的内存单元,然后是内容为A,B,C的内存单元均以字节定义共占8个字节
ARRAY2
DW
2,3
DUP(5)
以字为单位
一共四个字
共分配8个内存单元
ARRAY3
DD
20,30,40
以双字为单位
一共四个双字
共分配16个内存单元
⑷ c语言数组在内存中是怎么分配的
C语言中内存为分三类:栈区、堆区、静态数据区。
局部变量在栈上分配,函数调用前的栈指针,要和函数返回后的栈指针一样,否则就会出错。
void test(void)
{
char i,a[10];
printf("0x%x", &i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
}
(4)数组的存储单元分配扩展阅读
c语言数组在内存分配
示例:
#include<stdio.h>
int main()
{
int a[4] = {11,12,13,14};
int b[4] = {21,22,23,24};
int *pa = &a;
int i = 0;
while(i<8)
{
i++;
printf("now *p value = %d and",*pa);
printf("p addr value = %d ",pa);
pa++;
}
return 0;
}
⑸ C中二维数组的内存分配
数组不属于动态存储内存,它属于静态存储分配的,因为当你定义一个数组的时候,系统已经为其开辟了内存单元。
⑹ 若定义 int x [10];则 Turbo C编译系统为该数组分配多少个字节存储单元
在C语言里,int c[10]只有10个单元,即c[0]~c[9],这一点是与VB不一样的。
所以,是2*10=20个字节的存储单元。
⑺ 计算机如何给数组分配内存,有何要求
第一个问题: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。
⑻ C语言中的数组名a在内存在分配存储单元吗
获得用于存放数组a[10]首地址的单元 的地址?
printf("%x",&a[0]); 或者printf("%x",a);
数组首地址a为常量,不是变量,没有存储单元.使用printf("%x",&a); 得到的地址值是a[10]地址,完全因为巧合。编译器应该给出警告.
⑼ visualC为该数组分配多少个字节存储单元
这个要看具体的程序,你是如何声明这个数组的,无法一概而论。