C語言malloc函式如圖malloc前後的兩個型別說明符必須一致嗎?!為什麼

時間 2021-09-03 07:04:17

1樓:超可愛

不一定非要一致,但一般是一致的。

malloc前面的型別是強制轉換型別,該型別的選取與被賦值的指標型別一致。例如:int *p; p=(int *)malloc(sizeof(int)); p為int型指標,所以要將分配的記憶體空間轉化成int型別,賦值給p。

malloc後面的型別是為了給指標分配空間而計算記憶體大小的。sizeof(int)就是計算了int型別所佔的位元組數。extern void *malloc(unsigned int num_bytes);根據malloc函式的原型可以知道,它的引數實際為無符號整數型,所以後面不一定要用sizeof(int)這樣的引數,例如:

char *p; p=(char *)malloc(100); 也可以編譯通過,這就是為什麼不一定非要一致。

但是為什麼一般是一致的呢?就上面這個例子來看,我定義乙個char型別的指標,char資料一般是1個位元組,我給這個指標分配乙個位元組的空間就夠了, 但以上面的分配方式,我給乙個char指標分配了100個位元組的空間,這樣就有99個位元組你實際是用不到的,大大浪費了空間。

同理,int* p = (int *) malloc (1); **也能通過編譯,但事實上乙個需要4位元組的int型指標,只給它分配了1個位元組大小的記憶體空間,當你往裡頭存入乙個整數,就會有3個位元組無家可歸,而直接「住進鄰居家「!造成的結果是後面的記憶體中原有資料內容全部被清空。

所以一般後面用同型別的,保證你分配的指標所佔空間大小是與自己的型別相符的,避免了浪費空間和空間不夠的情況出現。

2樓:匿名使用者

void main()

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

標頭檔案:#include

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

返回值:如果分配成功則返回指向被分配記憶體的指標(此儲存區中的初始值不確定),否則返回空指標null。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。

函式返回的指標一定要適當對齊,使其可以用於任何資料物件。

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

所謂的「型別說明符」,就是指宣告的型別了。

因此,malloc後的sizeof(型別)必須與返回的指標的型別以及強轉的指標型別一致。

假設如果不一致:

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

該語句將p1指向一塊int型別指標的位址,卻只分配了char型別大小,這種情況在讀*p1的時候可能會得到乙個錯誤的資料,但筆者在vs2005試過,貌似沒有太大的問題,可能是編譯器自動修正了,但作為乙個合格的程式設計師這種情況還是盡量避免。

c語言中malloc是什麼?怎麼用

檀香透窗櫺 malloc 函式用來動態地分配記憶體空間,其原型為 void malloc size t size 說明 引數說明 size 為需要分配的記憶體空間的大小,以位元組 byte 計。函式說明 malloc 在堆區分配一塊指定大小的記憶體空間,用來存放資料。這塊記憶體空間在函式執行完成後不...

c語言voidmain在很多c語言中main前沒有為什

天河流紋石 c99規範要求main函式返回值必須是 int。但有些編譯器允許非標準的寫法,而且有一大批程式設計師不這樣寫。在應用角度來看,問題不大。但在原始碼規範上看,建議最好寫上。這就好比生活中,人們的口語總是有語病的。比如 你走先。這麼說,別人能聽懂 但要規範的話,還是要遵循語法。說成 你先走。...

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 擴充套件資料...