c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...
在C語言程序開發(fā)中,動態(tài)內(nèi)存分配是不可避免的,而調(diào)用 malloc()/free() 庫函數(shù)實現(xiàn)這一過程是方便的,事實上,在很多C語言程序中,malloc/free 庫函數(shù)的使用相當(dāng)頻繁,它倆的C語言函數(shù)原型如下,請看:
void *malloc(size_t size);void free(void *ptr);malloc() 函數(shù)需要類型轉(zhuǎn)換嗎?
正常情況下,malloc() 函數(shù)會從堆中申請 size 字節(jié)的內(nèi)存,并且將這塊內(nèi)存的首地址返回,原則上,系統(tǒng)不會再將被 malloc() 申請的內(nèi)存分配給其他代碼使用,除非 free() 函數(shù)將 malloc() 申請的內(nèi)存釋放。
malloc() 函數(shù)需要類型轉(zhuǎn)換嗎?
讀者應(yīng)該注意到,malloc() 函數(shù)的返回值是 void * 指針型的。看過我之前文章的讀者應(yīng)該明白,在C語言中,void * 指針是不能夠直接用于索引數(shù)據(jù)的。
void * 指針是不能夠直接用于索引數(shù)據(jù)的
因此在實際的C語言程序開發(fā)中,程序員調(diào)用 malloc() 函數(shù)時,一般都會定義其他類型的指針,例如:
char *cp = malloc(size);讀者看到這里,可能會產(chǎn)生疑問:malloc() 函數(shù)的返回值類型是 void * 指針型,而變量 cp 則是 char * 指針型,似乎出現(xiàn)了類型不匹配的情況,是否需要類型轉(zhuǎn)換呢?
是否需要類型轉(zhuǎn)換呢?
事實上,的確不少C語言程序員在調(diào)用 malloc() 函數(shù)時會使用類型轉(zhuǎn)換:
char *cp = (char *)malloc(size);int *ip = (int *)malloc(size * sizeof(int));...那么,調(diào)用 malloc() 函數(shù)時,究竟需要不需要類型轉(zhuǎn)換呢?
不需要?
有程序員認(rèn)為,C語言經(jīng)過這么多年的發(fā)展,對于 malloc() 函數(shù),如今似乎不再需要類型轉(zhuǎn)換了,因為 void * 指針會自動的并且安全的被轉(zhuǎn)換為對應(yīng)類型的指針。void * 指針在很多C語言教材中被稱為“萬能指針”,這里就是一個體現(xiàn)。
void * 指針在很多C語言教材中被稱為“萬能指針”
既然 void * 指針可以自動的被轉(zhuǎn)換成對應(yīng)的指針類型,那么再寫類型轉(zhuǎn)換代碼似乎就“多余”了,反而會讓整個C語言代碼啰嗦臃腫,損失可讀性,尤其是指針類型名很長的時候,例如:
struct this_is_test *p = (struct this_is_test *)malloc(size);// 不寫類型轉(zhuǎn)換代碼struct this_is_test *p = malloc(size);上面的C語言代碼顯然有重復(fù)部分,而且這段重復(fù)的C語言代碼的“類型轉(zhuǎn)換功能”也是多余的,要是以后需要修改結(jié)構(gòu)體 this_is_test 的名字,還需要修改強制類型轉(zhuǎn)換部分的代碼,略顯繁瑣。與之相對的,下面這行C語言代碼明顯簡潔許多。
下面這行C語言代碼明顯簡潔許多
這么看來,似乎對 malloc() 函數(shù)做類型轉(zhuǎn)換“百害而無一利”了,有程序員甚至認(rèn)為,在C語言程序開發(fā)中,調(diào)用 malloc() 函數(shù)使用類型轉(zhuǎn)換,只是因為不知道類型轉(zhuǎn)換會帶來的潛在不利而已。
需要?
不過,也有C語言程序員持反對意見,他們認(rèn)為,在調(diào)用 malloc() 時使用類型轉(zhuǎn)換可以讓代碼在 C語言和C++之間可移植,有些程序員以為自己在寫C語言程序,但是他們實際上還是會用到C++的一些特性。
在 C語言和C++之間可移植
另外,調(diào)用 malloc() 函數(shù)使用類型轉(zhuǎn)換還可以發(fā)現(xiàn)一些潛在的風(fēng)險,例如有的C語言程序員會在開發(fā)中弄混 type * 和 type ** ,如果沒有顯式的類型轉(zhuǎn)換,這樣的錯誤就會被編譯器隱藏掉了。
因此,在對 malloc() 函數(shù)的返回值做數(shù)據(jù)類型轉(zhuǎn)換的過程,本身就是C語言程序員自檢代碼的過程,這樣更加容易在開發(fā)階段就發(fā)現(xiàn) bug。而且,如果C語言程序出現(xiàn)了數(shù)據(jù)類型相關(guān)的錯誤,調(diào)用 malloc() 函數(shù)做了類型轉(zhuǎn)換肯定能夠更加方便的定位錯誤。
小結(jié)
弄清楚在C語言程序開發(fā)中調(diào)用 malloc() 函數(shù)時,做不做類型轉(zhuǎn)換的各自特點后,應(yīng)該能夠發(fā)現(xiàn)其實各有各的好處,那究竟是否需要做類型轉(zhuǎn)換,就在于程序員自己的開發(fā)習(xí)慣了。
點個贊再走吧
歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。
總結(jié)
以上是生活随笔為你收集整理的c语言怎么让写的函数兼容int型和char型_既然C语言void指针是“万能指针”,那么malloc还需类型转换吗?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配 22000mAh 容量电池,道格(D
- 下一篇: 润乾报表实现可反复分组报表及改进