c語言內存分配,C語言內存分配代碼說出不足

本文目錄一覽:

C語言中的動態內存分配的用法舉例

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

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

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

擴展資料:

函數運算符:

new

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

指針變數=new 數據類型;

例如:

int *p=new int

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

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

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

delete

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

delete 指針變數;

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

參考資料:百度百科–動態內存分配

C語言中內存分布及程序運行載入過程

一個程序內存分配:

下圖是APUE中的一個典型C內存空間分布圖(虛擬內存)

例如:

int g1=0, g2=0, g3=0;

int max(int i)

{

int m1=0,m2,m3=0, p_max;

static n1_max=0,n2_max,n3_max=0;

p_max = (int )malloc(10);

printf(“列印max程序地址\n”);

printf(“in max: 0xx\n\n”,max);

printf(“列印max傳入參數地址\n”);

printf(“in max: 0xx\n\n”,i);

printf(“列印max函數中靜態變數地址\n”);

printf(“0xx\n”,n1_max); //列印各本地變數的內存地址

printf(“0xx\n”,n2_max);

printf(“0xx\n\n”,n3_max);

printf(“列印max函數中局部變數地址\n”);

printf(“0xx\n”,m1); //列印各本地變數的內存地址

printf(“0xx\n”,m2);

printf(“0xx\n\n”,m3);

printf(“列印max函數中malloc分配地址\n”);

printf(“0xx\n\n”,p_max); //列印各本地變數的內存地址

if(i) return 1;

else return 0;

}

int main(int argc, char **argv)

{

static int s1=0, s2, s3=0;

int v1=0, v2, v3=0;

int p;

p = (int )malloc(10);

printf(“列印各全局變數(已初始化)的內存地址\n”);

printf(“0xx\n”,g1); //列印各全局變數的內存地址

printf(“0xx\n”,g2);

printf(“0xx\n\n”,g3);

printf(“======================\n”);

printf(“列印程序初始程序main地址\n”);

printf(“main: 0xx\n\n”, main);

printf(“列印主參地址\n”);

printf(“argv: 0xx\n\n”,argv);

printf(“列印各靜態變數的內存地址\n”);

printf(“0xx\n”,s1); //列印各靜態變數的內存地址

printf(“0xx\n”,s2);

printf(“0xx\n\n”,s3);

printf(“列印各局部變數的內存地址\n”);

printf(“0xx\n”,v1); //列印各本地變數的內存地址

printf(“0xx\n”,v2);

printf(“0xx\n\n”,v3);

printf(“列印malloc分配的堆地址\n”);

printf(“malloc: 0xx\n\n”,p);

printf(“======================\n”);

max(v1);

printf(“======================\n”);

printf(“列印子函數起始地址\n”);

printf(“max: 0xx\n\n”,max);

return 0;

}

列印結果:

ELF目標文件格式的最前端是 ELF****文件頭(****ELF Header****) ,

包含了描述整個文件的基本屬性,如ELF版本、目標機器型號、 程序入口地址 等

3 載入:

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

基本上C程序的元素存儲在內存的時候有3種分配策略:

靜態分配

如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端

自動分配

函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。

所以說C函數永遠不應該返回一個局部變數的地址。

要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。

動態分配

還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。

使用堆(Heap)內存將帶來額外的開銷和風險。

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

}

擴展資料

c語言數組在內存分配

示例:

#includestdio.h

int main()

{

int a[4] = {11,12,13,14};

int b[4] = {21,22,23,24};

int *pa = a;

int i = 0;

while(i8)

{

i++;

printf(“now *p value = %d and”,*pa);

printf(“p addr value = %d \n”,pa);

pa++;

}

return 0;

}

C語言中分配內存

要實現根據程序的需要動態分配存儲空間,就必須用到以下幾個函數

1、malloc函數

malloc函數的原型為:

void

*malloc

(u

igned

int

size)

其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。還有一點必須注意的是,當函數未能成功分配存儲空間(如內存不足)就會返回一個NULL指針。所以在調用該函數時應該檢測返回值是否為NULL並執行相應的操作。

下例是一個動態分配的程序:

#include

#include

main()

{

int

count,*array;

/*count是一個計數器,array是一個整型指針,也可以理解為指向一個整型數組的首地址*/

if((array(int

*)

malloc(10*sizeof(int)))==NULL)

{

printf(“不能成功分配存儲空間。”);

exit(1);

}

for

(count=0;count〈10;count++)

/*給數組賦值*/

array[count]=count;

for(count=0;count〈10;count++)

/*列印數組元素*/

printf(“%2d”,array[count]);

}

上例中動態分配了10個整型存儲區域,然後進行賦值並列印。例中if((array(int

*)

malloc(10*sizeof(int)))==NULL)語句可以分為以下幾步:

1)分配10個整型的連續存儲空間,並返回一個指向其起始地址的整型指針

2)把此整型指針地址賦給array

3)檢測返回值是否為NULL

2、free函數

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

其函數原型是:

void

free(void

*p)

作用是釋放指針p所指向的內存區。

其參數p必須是先前調用malloc函數或calloc函數(另一個動態分配存儲區域的函數)時返回的指針。給free函數傳遞其它的值很可能造成死機或其它災難性的後果。

注意:這裡重要的是指針的值,而不是用來申請動態內存的指針本身。例:

int

*p1,*p2;

p1=malloc(10*sizeof(int));

p2=p1;

……

free(p2)

/*或者free(p2)*/

malloc返回值賦給p1,又把p1的值賦給p2,所以此時p1,p2都可作為free函數的參數。

malloc函數是對存儲區域進行分配的。

free函數是釋放已經不用的內存區域的。

所以由這兩個函數就可以實現對內存區域進行動態分配並進行簡單的管理了。

原創文章,作者:KNGT,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/139524.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KNGT的頭像KNGT
上一篇 2024-10-04 00:22
下一篇 2024-10-04 00:22

相關推薦

  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • Python變數在內存中的存儲

    該文章將從多個方面對Python變數在內存中的存儲進行詳細闡述,包括變數的聲明和賦值、變數的引用和指向、內存地址的變化、內存管理機制等。 一、聲明和賦值 在Python中,變數聲明…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論