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