當前位置:首頁 » 編程語言 » c語言內存分配方式
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言內存分配方式

發布時間: 2022-12-09 01:52:28

1. c語言中的動態內存分配的用法舉例

1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。

2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。

3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。

(1)c語言內存分配方式擴展閱讀:

函數運算符:

new

運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:

指針變數=new 數據類型;

例如:

int *p=new int

該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。

new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:

指針變數=new 數據類型(初始值)。

delete

堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:

delete指針變數;

其中的指針變數中保存著new分配的內存的首地址。

2. C語言各種數據在內存中的分配方式,分別對程序的運行效率有哪些影響

從另一個角度,從變數值存在的作時間(即生存期)角度來分,可以分為靜態存儲方式
和動態存儲方式。
靜態存儲方式:是指在程序運行期間分配固定的存儲空間的方式。
動態存儲方式:是在程序運行期間根據需要進行動態的分配存儲空間的方式。

3. c語言內存有幾種分配方式

基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。

4. C語言中內存的分配方式有哪3種,用文字或表達式列出各自的一個例子

1.malloc(n*sizeof(int))
/*
請求n個連續的、每個長度為整型的空間,若成功返回這些空間的首地址,失敗返回0
*/
2.realloc(p,sizeof(int)*n)
/*
給一個已經分配了地址的指針重新分配空間,參數p為原有的空間地址*/
3.數組的定義。

5. 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);

}

(5)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;

}

6. C語言結構體在內存中的分配

因為內存對齊。
為了CPU更快地定址,編譯器會進行內存對齊。
char c1; //分配1位元組空間
char c2; //分配1位元組空間
short s; //上面的兩個char佔用空間剛好等於一個short,不會發生對齊,分配2位元組空間
int i; //上面的兩個char一個short佔用空間剛好等於一個int,不會發生對齊,分配4位元組空間
因此最後結構體test2的size為8位元組
char c1; //分配1位元組空間
short s; //地址未對齊,會發生內存對齊,補齊1位元組的空間,然後再為short分配2位元組空間
char c2; //分配1位元組空間
int i; //地址未對齊,會發生內存對齊,補齊3位元組的空間,然後再為int分配4位元組空間
因此最後結構體test1的size為1+1(補齊)+2+1+3(補齊)+4=12位元組
欲知詳情,請網路「內存對齊」,這里不再詳述。

7. 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;

}

8. C語言各種數據在內存中的分配方式,分別對程序的運行效率有哪些影響

內存分配?
堆棧的綜合效率最高(除寄存器外),一般函數(包括main())的變數都是在堆棧內的。
你可以顯示聲明register 但是是存在寄存器還是一般的堆棧完全由編譯器決定優化,其實你加了也沒用。。。。。堆棧是在內存的一塊固定大小的區域,比較小,數據量大了會爆棧(綜合最高是因為會有部分內容進入寄存器,寄存器比內存快)。
全局變數是在全局變數區的,全局變數區是在內存中的固定大小的一塊區域。全局變數區也不怎麼大,但是比堆棧大多了。。。。
函數代碼區。。。是在內存 你無視好了。。。
堆區 是在內存的一塊很大很大的區域,一切動態建立的對象(c用alloc家族函數 c++的new)都是在堆區,一般堆區是不會爆的,除非真的很大大大大大。。
效率上講 寄存器最快,然後就是內存了,磁碟的讀寫不考慮。
綜上,編譯器會幫你優化的,你只要關心會不會爆棧,會不會爆全局變數,就行了。。
還有字元串常量區,也是在內存中的,你也無視好了。。。。。
還有靜態區也是在內存中的,大小是編譯器編譯時決定的,你也無視好了。。。。

9. 在C語言中,如何給函數分配內存

不知lz有沒聽說過虛存一說,當源碼被編譯成二進制文件後,其中的變數,函數的虛擬地址,也就是內存空間中的地址就已確定,在運行時,操作系統為其分配物理內存並添加虛擬地址到物理地址的映射。
再說的多一點,一個進程(運行的程序)可分為若干段:代碼段、數據段、堆棧段等,其中函數所操作的空間(也就是局部變數的空間)就位於堆棧段,所謂函數分配內存大小,實際就是堆棧段指針的變化而已。

10. c語言有幾種分配內存的方式,有什麼區別

一般而言,有兩種內存分配的方式。
1、在棧上分配。特點是當變數離開其作用域時,其內存即釋放了,例如局部變數、函數參數等都是在棧上分配的。
2、在堆上分配。特點是變數一直存在,例如new運算符分配出來的內存、全局變數和static靜態變數都是在堆上分配的。