c語言 malloc 函式 分配記憶體空間尺寸的問題

2022-02-08 08:32:13 字數 3267 閱讀 2928

1樓:王斌隨

這個問題首先得從堆疊說起,一個程式一般分為三段:**段,資料段(靜態資料),和堆疊段。堆疊段儲存程式中的變數、程式傳遞的引數等(動態分配的變數儲存在堆中,靜態分配的儲存在棧中)。

堆疊的增長方式如下:

程式在執行的時候會預先分配堆疊空間,所以你的問題中不一定修改了不該修改的地方,有可能那裡本來就是空的。

再回到malloc這個函式上來,malloc主要負責分配空間,返回該空間的首地址。那為什麼申請空間為0,卻可以儲存7個字元呢?那是因為c語言的指標中並不檢查陣列的越界問題,不信的話,你可以這樣:

char ch[5],然後你去讀寫ch[6](printf或scanf),這樣是不會報錯的。但是我們在使用的時候,千萬別越界使用,因為這樣的程式是非常危險的,試想,如果越界使用的地址正好是一個作業系統的地址,那麼你一修改,系統就崩了。同時,c語言的這個機制被黑客廣泛地應用與緩衝區溢位攻擊,所以你非但不能越界使用指標,還得時刻考慮到指標(陣列)是否越界,以加強程式的安全性。

希望對你有所幫助。。。

2樓:樂跑小子

c語言中malloc是動態記憶體分配函式。

函式原型:void *malloc(unsigned int num_bytes);

引數:num_bytes 是無符號整型,用於表示分配的位元組數。

返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。void* 表示未確定型別的指標,void *可以指向任何型別的資料,更明確的說是指申請記憶體空間時還不知道使用者是用這段空間來儲存什麼型別的資料(比如是char還是int或者...

)功能:分配長度為num_bytes位元組的記憶體塊

注意:當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指標一定要適當對齊,使其可以用於任何資料物件。

關於該函式的原型,在以前malloc返回的是char型指標,新的ansic標準規定,該函式返回為void型指標,因此必要時要進行型別轉換。

例項:#include"stdio.h"

#include"malloc.h"//malloc()函式被包含在malloc.h裡面

int main(void)

sprintf(a,"%s","helloworld\n");//"helloworld\n"寫入a指向的地址

printf("%s\n",a);//輸出使用者輸入的資料

free(a);//釋放掉使用的記憶體地址

return0;}

3樓:匿名使用者

malloc是給指標變數分配記憶體空間的函式命令正確使用:

分配的空間要能保證容下你想儲存的資料,不要和機器逗著玩(分配0空間,或少於自己實際需要的空間),如你上面的操作,表面上你程式執行沒有問題,可實際上你佔用了別人的地盤,只是當前你很幸運沒有使程式出現問題,但不保證一定不出問題!!

不再使用的指標,一定要free()來釋放空間!malloc 與free要配對使用,即:有malloc必要有free

4樓:匿名使用者

你何必糾結一定要分配使用者輸入字元數量長度的空間呢?開一個足夠大的陣列不就得了?

如果你一定要malloc準確的大小,你可以char *c;

char *s=malloc(100000*sizeof(char));//malloc一個足夠大的陣列,暫時儲存輸入

scanf("%s",s);

c=(char*)malloc(strlen(s)*sizeof(char));

strcpy(c,s);

free(s);//輸入結束後把輸入儲存,再把這個大陣列釋放

c語言malloc函式分配的記憶體空間是分配後立即被排他地佔用嗎?

5樓:匿名使用者

malloc申請記憶體頁面,如果不夠是會返回失敗的。頁表和記憶體大小是對應的。除非是**執行,以缺頁中斷的形式調入調出。

如果是申請空間,除非用完小段空間後釋放,不然申請超過一定大小的記憶體會失敗、

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

6樓:匿名使用者

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函式手動釋放。

7樓:樑丘鴻遠冒睿

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

void

*malloc(int

size);

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

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

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

void

memset(void

*start,

intvalue,

intsize);

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

0,len);

8樓:匿名使用者

自己malloc出來當然知道位元組大小,如果把指標傳給一個函式呢,函式如果不知道其空間大小,對其操作時是有很大溢位風險的,但我又不想增加一個傳入引數,sizeof()的確算不出指標指向的空間大小,那隻能將指標交給與他人使用的時候,把空間大小也告訴對方。所以有時候沒辦法要妥協一下

只通過指標貌似無法知道指標指向的空間大小,那麼free函式又是怎麼知道呢。malloc在分配空間的時候會多分配一些空間來存放分配資訊。(據說在每個記憶體塊的最前的4個位元組就存放了malloc的位元組大小資訊,可以自己寫一個函式把這些資料提出來,我目前還沒有試驗過)

c語言的malloc函式的引數問題,老是報錯

typedef struct edgenode link,edgenode link lnode int adjvex,link next link已經被你定義成struct edgenode 了。注意你的typedef。你的語句要改為 m link malloc sizeof edgenode m...

c語言pow函式,C語言pow函式

pow 函式用來求x的y次冪,x y及函式值都是double型 其原型為 double pow double x,double y 例項 如下 include include void main double x 2,y 10 printf f n pow x,y return 0 擴充套件資料 在...

C動態記憶體分配的問題,關於C 動態記憶體分配的問題。

ostream operator 這個函式的du問題,你用的不zhi是引用型別,當daomain裡面的cout 後,因為內部的ch需要版析權構,所以checkoutrecord的wait list會被析構掉。具體你可以看自己的析構方法。最好不要在vector中放指標,一般人都會用錯。delete i...