c語言動態內存分配
㈠ c語言指針動態內存分配問題
如上分配動態內存後
p是指向這片連續內存空間的頭還是尾?
是連續內存空間的頭。
那(struct
student
*)malloc(sizeof(struct
student))會分配多少個位元組?
14
位元組,如果4位元組對齊(vc
默認的),則為16位元組。
㈡ 關於c語言動態內存分配的問題
要實現動態內存的分配,除了利用含指針成員的結構體之外,還需利用C語言提供的幾個標准庫函數。(使用時應包含頭文件「alloc.h」或「malloc.h」或「stdlib.h」)
1.malloc函數
函數原型為void
*malloc(unsigned
int
size);在內存的動態存儲區中分配一塊長度為"size"
位元組的連續區域。函數的返回值為該區域的首地址。
「類型說明符」表示把該區域用於何種數據類型。(類型說明符*)表示把返回值強制轉換為該類型指針。「size」是一個無符號數。例如:
pc=(char
*)
malloc
(100);
表示分配100個位元組的內存空間,並強制轉換為字元數組類型,函數的返回值為指向該字元數組的指針,
把該指針賦予指針變數pc。若size超出可用空間,則返回空指針值NULL。
2.calloc
函數
函數原型為void
*calloc(unsigned
int
num,
unsigned
int
size)
按所給數據個數和每個數據所佔位元組數開辟存儲空間。其中num為數據個數,size為每個數據所佔位元組數,故開辟的總位元組數為
num*size。函數返回該存儲區的起始地址。calloc函數與malloc
函數的區別僅在於一次可以分配n塊區域。例如:
ps=(struct
stu*)
calloc(2,sizeof
(struct
stu));
其中的sizeof(struct
stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu類型,並把其首地址賦予指針變數ps。
3.
realloc函數:
函數原型為void
*realloc(void
*ptr,
unsigned
int
size)
重新定義所開辟內存空間的大小。其中ptr所指的內存空間是用前述函數已開辟的,size為新的空間大小,其值可比原來大或小。函數返回新存儲區的起始地
址(該地址可能與以前的地址不同)。例如p1=(float
*)realloc(p1,16);將原先開辟的8個位元組調整為16個位元組。
**動態申請的內存空間要進行手動用free()函數釋放
㈢ C語言如何動態分配內存
#include <stdio.h>
#include <malloc.h>
int main()
{
int *p = (int *)malloc(10); //動態申請10位元組內存空間
free(p); //釋放申請的內存空間
getchar();
return 0;
}
㈣ C語言中的動態內存分配的用法舉例
1、malloc函數:其作用是在內存的動態存儲區中分配一個長度為size的連續空間。其參數是一個無符號整形數,返回值是一個指向所分配的連續存儲域的起始地址的指針。
2、free函數:由於內存區域總是有限的,不能不限制地分配下去,而且一個程序要盡量節省資源,所以當所分配的內存區域不用時,就要釋放它,以便其它的變數或者程序使用。這時我們就要用到free函數。
3、calloc函數:其作用是在內存的動態存儲區中分配n個長度為 size 的連續空間。函數返回一個指向分配區域的起始位置的指針;如果分配不成功,則返回NULL。
(4)c語言動態內存分配擴展閱讀:
函數運算符:
new
運算符new用於向系統申請動態存儲空間,並把首地址作為運算結果,它的使用形式為:
指針變數=new 數據類型;
例如:
int *p=new int
該語句的作用是會用new從內存中申請了一個int型變數(4個位元組),並將該變數的首地址賦給指針變數p。
new所建立的變數的初始值是任意的,也可在用new分配內存的同時進行初始化。使用形式為:
指針變數=new 數據類型(初始值)。
delete
堆內存可按照要求進行分配,程序對內存的需求量隨時會發生變化,有時程序在運行種可能會不再需要由new分配的內存空間,而且程序還未運行結束,這時就需要把先前佔用的內存空間釋放給堆內存,以後重新分配,供程序的其他部分使用。運算符delete用於釋放new分配的內存空間,刪除建立的對象,它的使用形式為:
delete指針變數;
其中的指針變數中保存著new分配的內存的首地址。
㈤ c語言程序怎麼實現動態內存分配
一、原型:externvoid*malloc(unsignedintnum_bytes);
頭文件:#include<malloc.h>
功能:分配長度為num_bytes位元組的內存塊
說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
當內存不再使用時,應使用free()函數將內存塊釋放。
(分配類型*)malloc(分配元素個數*sizeof(分配類型))//對應上述malloc函數如果成功,則返回該空間首地址,該空間沒有初始化,如果失敗,則返回0
#include<stdio.h>
#include<malloc.h>
intmain()
{
char*p;
p=(char*)malloc(100);
if(p)//判斷分配的空間是否為NULL
printf("MemoryAllocatedat:%x/n",p);
else
printf("NotEnoughMemory!/n");
free(p);
return0;
}
㈥ c語言內存有幾種分配方式
基本上C程序的元素存儲在內存的時候有3種分配策略:
靜態分配
如果一個變數聲明為全局變數或者是函數的靜態變數,這個變數的存儲將使用靜態分配方式。靜態分配的內存一般會被編譯器放在數據段或代碼段來存儲,具體取決於實現。這樣做的前提是,在編譯時就必須確定變數的大小。 以IA32的x86平台及gcc編譯器為例,全局及靜態變數放在數據段的低端;全局及靜態常量放在代碼段的高端
自動分配
函數的自動局部變數應該隨著函數的返回會自動釋放(失效),這個要求在一般的體系中都是利用棧(Stack)來滿足的。相比於靜態分配,這時候,就不必絕對要求這個變數在編譯時就必須確定變數的大小,運行時才決定也不遲,但是C89仍然要求在編譯時就要確定,而C99放鬆了這個限制。但無論是C89還是C99,都不允許一個已經分配的自動變數運行時改變大小。
所以說C函數永遠不應該返回一個局部變數的地址。
要指出的是,自動分配也屬於動態分配,甚至可以用alloca函數來像分配堆(Heap)一樣進行分配,而且釋放是自動的。
動態分配
還有一種更加特殊的情況,變數的大小在運行時有可能改變,或者雖然單個變數大小不變,變數的數目卻有很大彈性,不能靜態分配或者自動分配,這時候可以使用堆(Heap)來滿足要求。ANSI C定義的堆操作函數是malloc、calloc、realloc和free。
使用堆(Heap)內存將帶來額外的開銷和風險。
㈦ C語言分配動態內存,分配的是否只能是連續的內存
每一次分配的內存是連續的,但如果用結構體鏈表來管理分配的內存就可以將每一次分配的內存虛擬的連接起來
但前提是每一次分配的內存還是連續的,只是每個節點所佔的內存單元不是連續的
-物聯網校企聯盟技術部
㈧ 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函數是釋放已經不用的內存區域的。
所以由這兩個函數就可以實現對內存區域進行動態分配並進行簡單的管理了。
㈨ 什麼是c語言裡面的動態存儲分配函數啊
動態內存分配即分配內存大小在運行時才確定,一般在堆中分配。
C語言動態內存分配相關的函數如下幾個:malloc、calloc、realloc、free;
malloc函數的使用比較直接,一個成功的malloc調用返回分配的size大小的內存的指針。失敗時返回NULL並將錯誤代碼置為ENOMEM。
calloc函數可以分配nr個size大小的內存空間,一般用於一組struct結構體的分配。
realloc函數將ptr指向的內存空間重新分配大小為size並返回新的內存首地址。
free函數釋放前三個函數申請的內存空間,所以,使用前三個分配函數分配的內存一定要free掉。
㈩ 關於C語言動態分配內存的問題
要實現動態內存的分配,除了利用含指針成員的結構體之外,還需利用C語言提供的幾個標准庫函數。(使用時應包含頭文件「alloc.h」或「malloc.h」或「stdlib.h」)
1.malloc函數
函數原型為void *malloc(unsigned int size);在內存的動態存儲區中分配一塊長度為"size" 位元組的連續區域。函數的返回值為該區域的首地址。 「類型說明符」表示把該區域用於何種數據類型。(類型說明符*)表示把返回值強制轉換為該類型指針。「size」是一個無符號數。例如: pc=(char *) malloc (100); 表示分配100個位元組的內存空間,並強制轉換為字元數組類型,函數的返回值為指向該字元數組的指針, 把該指針賦予指針變數pc。若size超出可用空間,則返回空指針值NULL。
2.calloc 函數
函數原型為void *calloc(unsigned int num, unsigned int size)
按所給數據個數和每個數據所佔位元組數開辟存儲空間。其中num為數據個數,size為每個數據所佔位元組數,故開辟的總位元組數為 num*size。函數返回該存儲區的起始地址。calloc函數與malloc 函數的區別僅在於一次可以分配n塊區域。例如: ps=(struct stu*) calloc(2,sizeof (struct stu)); 其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu類型,並把其首地址賦予指針變數ps。
3. realloc函數:
函數原型為void *realloc(void *ptr, unsigned int size)
重新定義所開辟內存空間的大小。其中ptr所指的內存空間是用前述函數已開辟的,size為新的空間大小,其值可比原來大或小。函數返回新存儲區的起始地 址(該地址可能與以前的地址不同)。例如p1=(float *)realloc(p1,16);將原先開辟的8個位元組調整為16個位元組。
**動態申請的內存空間要進行手動用free()函數釋放
例子:
char *p;
p=(char*)malloc(8);//開辟8個位元組的存儲空間,並把地址賦給指針p,通過指針p對該空間進行存取操作。
*p='L'; //存儲字元,所分配空間的第0位元組存儲L
*(p+1)='o';//分配空間的第一位元組存儲字元'o'.
*(p+2)='v';
*(p+3)='e';
*(p+4)='\0';
puts(p);//輸出字元串
free(p);//釋放空間
注意:*(p+n)等價於p[n],(p+n)是地址,而*(p+n)就是取地址(p+n)的內容。
如上面程序中的*(p+1)='A';可寫成p[1]='A';
malloc()函數的參數可以是常數、變數或表達式等。除了存放字元串外,malloc()也可取得空間來存儲整數等數據。例如存儲整數分配空間如下:
int *ptr;
ptr=(int *)malloc(sizeof(int)*4);
malloc()開辟空間存儲4個整數數據,由於malloc()總傳回第0位元組的地址,且返回值必定是char*類型,所以要通過(int *)來強制轉換為指向整型後存入指向整型的指針ptr.
當用malloc()函數分配空間時,若計算機無法提供足夠的空間分配則會返回NULL指針。所以,若返回的指針為NULL,就表示可分配的剩餘空間已不足。