c語言中內存
『壹』 c語言的內存變數
存儲類別指的是數據在內存中存儲的方法。存儲方法分為靜態存儲和動態存儲兩大類。標准C語言為變數、常量和函數定義了4種存儲類型:extern、auto、static、register。根據變數的存儲類別,可以知道變數的作用域和存儲期。這4種存儲類型可分為兩種生存期限:永久的(在整個程序執行期都存在)和臨時的(暫時保存在堆棧和寄存器中)。extern和static用來標識永久生存期限的「變數和函數」,而anto和register用來標識臨時生存期限的"變數"。只有變數才有臨時生存期限。一個變數和函數只能具有一個存儲類型,也只能有一種生存期限。
內存中供用戶使用的空間有三部分:
程序區:存放程序的可執行代碼;
靜態存儲區:存放靜態變數(全局變數和靜態局部變數);
動態存儲區:存放函數調用時調用函數的現場保護和返回地址、函數形參、自動局部變數;
變數的聲明分為」定義性聲明「(需建立存儲空間,如:int a;)和」引用性聲明「(不需建立存儲空間,如extern a;)。廣義上講,聲明包括定義,一般為敘述方便,把建立存儲空間的聲明稱定義,而不不需建立存儲空間的聲明稱聲明。
auto
函數中的局部變數,如果不用關鍵字static加以聲明,編譯系統對它們是動態地分配存儲空間的。函數的形參和在函數中定義的變數(包括在復合語句中定義的變數)都屬此類。在調用該函數時,系統給形參和函數中定義的變數分配存儲空間,數據存儲在動態存儲區中。在函數調用結束時就自動釋放這些空間。如果是在復合語句中定義的變數,則在變數定義時分配存儲空間,在復合語句結束時自動釋放空間。因此這類局部變數稱為自動變數(auto variable)。自動變數用關鍵字auto作存儲類別的聲明。
對自動變數賦初值,不是在編譯時進行的,而是在函數調用時進行。對自動變數來說,若不賦初值,則它的值是一個不確定的值。
『貳』 C語言中內存的分配方式有哪3種,用文字或表達式列出各自的一個例子
1.malloc(n*sizeof(int))
/*
請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址,失敗返回0
*/
2.realloc(p,sizeof(int)*n)
/*
給一個已經分配了地址的指針重新分配空間,參數p為原有的空間地址*/
3.數組的定義。
『叄』 在c語言中 佔用的內存
那個一般是以前的系統了16位的
現在一般是32位
不同的計算機他們的字母
數字等所佔位元組數不同。
但是一個字元一般都只佔一個位元組
而整數一般占
2個或4個位元組
在C語言中
有個sizeof函數。
你定義個整數
i
n
int
i,n;
n=sizeof(i);
再輸出n的只看是幾
就代表幾位了。。
printf("%d",n);
字元就用
char
i;
int
n;
還有實型
float
i;
int
n;
『肆』 c語言內存有幾種分配方式
基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。
『伍』 c語言中基本數據類型包括哪些分別佔多大內存
數據類型在內存上所佔空間大小與操作系統位數有關。一般常說的數據類型在內存上所佔空間大小默認指的都是32位操作系統,這也是用的比較多的。
char 1位元組
short 2位元組
int 4位元組
long 4位元組(64位操作系統下為8位元組)
float 4位元組
double 8位元組
『陸』 C語言中,各種類型的整型數據在內存中都佔用4個位元組嗎
不是。
C標准並沒有具體給出規定哪個基本類型應該是多少個位元組數,而且這個也與OS、編譯器有關,比如同樣是在32位操作系統,VC++的編譯器下int類型為4個位元組,而在tuborC下則是2個位元組。
整型類型在雖然16位、32位或者64位的機子各種類型並不一樣,但有幾條規則(ANSI/ISO制定):
short至少佔用2個位元組。
int建議為一個機器字長,32位環境下為4位元組,64位環境下為8位元組。
short的長度不能大於int,long的長度不能小於int。
(6)c語言中內存擴展閱讀
整型數據分為基本整形(int)、短整型(short int)、長整型(long int)以及新添加的雙長整型(long long int)。
基本整形(int):一般占據2個或者4個位元組,這都是有編譯系統決定的。一般來講在vc中計算機給它分配4個位元組,在計算機中整型數據一般是按補碼的形式存儲的。
短整型(short int):在vc中計算機分配給短整型的內存大小為2個位元組。存儲方式與基本整形相同,一個短整型的數據范圍是:-32768-32767。
長整型數據(long int):在vc中系統分配給它4個位元組,多以一個長整型數據的范圍為-2的31次方到2的31次方減一。
雙長整型(long long int):在vc中系統給它分配8個位元組,這種數據類型一般比較少用。
『柒』 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);
}
(7)c語言中內存擴展閱讀
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語言問題:內存的分配方式有哪幾種
1、靜態存儲區分配
內存分配在程序編譯之前完成,且在程序的整個運行期間都存在,例如全局變數、靜態變數等。
2、棧上分配
在函數執行時,函數內的局部變數的存儲單元在棧上創建,函數執行結束時這些存儲單元自動釋放。
3、堆上分配
堆分配(又稱動態內存分配)。程序在運行時用malloc或者new申請內存,程序員自己用free或者delete釋放,動態內存的生存期由我們自己決定。
(8)c語言中內存擴展閱讀
棧上分配數組
#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(" ");
}
}
『玖』 c語言中動態分配內存的關鍵字
1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。