C語言指標動態記憶體分配,C語言中的動態記憶體分配的用法舉例

時間 2022-09-01 20:20:03

1樓:柳凝蓮

void* malloc(size_t size)

這個函式請求分配大小為size位元組的記憶體,並返回指向該塊記憶體起始位置的指標

它接受的引數型別size_t是unsigned int的一個typedef,這種型別用來表示資料型別的大小(如char型別的大小為1(位元組))

它返回的是一個void*型別的指標,需要強制轉換成需要的指標型別之後才能使用

這樣第三行**的意思就是分配一塊大小為sizeof(char*)(一個char*指標的大小)的記憶體,並通過賦值讓p指向這塊記憶體,其中p是一個指向char*型別指標的指標

第五行中,p[i]相當於*(p + i)(不知道回去看陣列),p是指向char指標的指標,p[i]是對p間接引用就是char*型別指標,然後這個迴圈是對每個大於等於0小於a的i,分配一塊大小為sizeof(char)的記憶體,並讓p[i]指向相應的這塊記憶體

2樓:匿名使用者

解釋第五行。第三行自己理解。一樣的。sizeof(char)是獲得char所需要的空間大小。你這裡就是一個位元組。

(char*)malloc前面的的(char*)表示這返回是一個char型別的指標給p[i]。指標指向空間首地址(這個空間也就是前面分配的那一個位元組)。。

c語言中的動態記憶體分配的用法舉例

3樓:匿名使用者

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

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

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

擴充套件資料:

函式運算子:

new指標變數=new 資料型別;

例如:int *p=new int

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

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

指標變數=new 資料型別(初始值)。

delete

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

delete 指標變數;

其中的指標變數中儲存著new分配的記憶體的首地址。

4樓:**的可樂

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

1、malloc函式

malloc函式的原型為:

void *malloc (u igned int size)

其作用是在記憶體的動態儲存區中分配一個長度為size的連續空間。其引數是一個無符號整形數,返回值是一個指向所分配的連續儲存域的起始地址的指標。還有一點必須注意的是,當函式未能成功分配儲存空間(如記憶體不足)就會返回一個null指標。

所以在呼叫該函式時應該檢測返回值是否為null並執行相應的操作。

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

#include

#include

main()

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函式是釋放已經不用的記憶體區域的。

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

5樓:

例如malloc,zizeof,free等原型:extern void *malloc(unsigned int num_bytes);

用法:#include

功能:分配長度為num_bytes位元組的記憶體塊說明:如果分配成功則返回指向被分配記憶體的指標,否則返回空指標null。

當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

舉例:// malloc.c

#include

#include

main()

6樓:匿名使用者

#include

#include

#define str_len 4096

int main ()

c語言 關於為指標的指標分配記憶體的問題

7樓:匿名使用者

首先:int** 是一個二級指標,它是指標的指標,如果你要申請一個二維陣列,有下面兩個方法:

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

int i;

for(i = 0; i < 10)

val[i] = (int*)malloc(sizeof(int) * 10);

然後你可以這樣引用:*(*(val+m)+n) = value;

第二種:int* val = (int*)malloc(sizeof(int) * 10 * 10);

然後這樣引用:*(m*10 + n) = value;

這其實就是個一維陣列,不過你把它看成二維的處理。。

希望對你有幫助哦

8樓:匿名使用者

//給你一段**看看,呵呵。

int i=0,j=0,x=10,y=10;

int **array=null;

//注意,是這樣申請空間的,一次性完成

array=(int**)malloc(sizeof(int)*x*y + y*sizeof(int*));

array[0]=(int*)((char*)array + y*sizeof(int*));

for(i=1;ifor( i = 0 ; i < y; i++ )}for( i = 0 ; i < y; i++ )}free(array);//注意,是這樣釋放空間的,一次性完成

9樓:

array 是 int * * 型的嗎?我在vc6.0測試,分配記憶體是正確的,但要明白,分配的記憶體都被認為是int*型的,也就是101個int*型的空間。

*(array+j)得到這101個空間中的某個,是int*型,*(*(array+j)+n)是這101個指標中的某一個指向的記憶體空間,而這個記憶體空間沒有分配,所以程式執行時會出錯。至於在16位機器上通過,只是僥倖而已,因為16位機器沒有記憶體保護,所有的空間都能訪問,如果訪問了作業系統的空間,可能不會立即崩潰,但系統有可能出問題的。而32位機器有保護模式,訪問非法空間系統會報錯。

10樓:匿名使用者

使用sizeof,就和機器位數無關~

二級指標動態分配方式如下:

int **a;

a=(int**)malloc(m*sizeof(int*));

for(i=0;ia[i]=(int*)malloc(n*sizeof(int));

怎麼檢視動態分配記憶體空間的大小(c語言)。

11樓:匿名使用者

1、這個空間是自己分配的,既然已經寫了p=(int *)malloc(10000)那就分配10000的大小,還需要顯示多少大小。對於一個指向一塊記憶體的指標如果用比如sizeof(p)顯示大小(int * p=new int[10]),也只是顯示4,代表首地址大小,不能顯示正塊記憶體的大小,而且根本沒有意義。

2、動態記憶體分配,可以自由的分配指定大小的記憶體空間。當程式執行時,程式設計師並不清楚某一資料需要的具體記憶體空間大小時,可以使用動態分配。

malloc函式原型

void *malloc(int nsize)

分配一個nsize大小的記憶體空間,如果分配成功則返回地址空間的首地址,如果分配失敗則返貨null

nsize一般使用 sizeof(型別a)*n 的計算方式獲取大小。意思為:為分配n個型別a所佔空間的大小。

獲取的指標地址需要強制轉換為指定型別

例如:int *p = (int*)malloc(sizeof(int)*100);

使用malloc動態分配的記憶體空間需要使用free函式手動釋放。

12樓:樑丘鴻遠冒睿

在c語言中,要在堆上分配空間,需要使用記憶體申請函式。一般用malloc。

void

*malloc(int

size);

可以申請一段長度為size位元組的空間,並返回空間的首地址。

要清空分配的記憶體空間,也就是將該空間所有位元組均賦值為0,可以使用memset函式。

該函式宣告與string.h中,形式為

void

memset(void

*start,

intvalue,

intsize);

如果要清空空間的首地址為p,大小為len,則可以呼叫memset(p,

0,len);

c語言指標陣列不需要分配記憶體,C語言 指標陣列不需要分配記憶體?

天雲一號 指標陣列是需要分配記憶體單元的。指標陣列表示一個指標型別的陣列,陣列中每個元素都是一個指標,而c語言中指標只佔4個位元組,所以指標陣列所佔的記憶體大小為4 n n為陣列的大小 舉例如下 int a 5 定義一個int型別的指標陣列,共5個元素,每個元素都是一個int型別的指標,共佔用4 5...

c語言關於為指標的指標分配記憶體的問題

首先 int 是一個二級指標,它是指標的指標,如果你要申請一個二維陣列,有下面兩個方法 int val int malloc sizeof int 10 int i for i 0 i 10 val i int malloc sizeof int 10 然後你可以這樣引用 val m n value...

c語言的函式指標舉個例子,c語言中函式指標是什麼 有什麼用 舉個例項

劉文正粉絲 函式指標告訴cpu下一步需要執行 的 的指標,一陣列十分相像.include void function int i,double d 一個函式的宣告 void anotherfunction int i,double d 另外一個函式宣告 int main mxl033 回答是對的。v...