⑴ 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為該數組分配多少個位元組存儲單元
這個要看具體的程序,你是如何聲明這個數組的,無法一概而論。