本文目錄一覽:
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-hk/n/139524.html