在C語言中,如何安全地使用void*?
01-05
在C語言中,void*因為可以靈活地接收任何數據類型而被廣泛使用。但是它天生設計上要求用戶清楚自己傳遞的是什麼類型,不幸的是有時候使用者其實並不100%了解,例如傳遞了類型A,但是用類型B去解析,從而導致嚴重後果 。
問題:有沒辦法避免這種問題?例如使用範例,或者有沒有替代的更安全的技術。
所以你需要C++。
沒有辦法,
void*因為可以靈活地接收任何數據類型
沒這個事情。
傳遞了類型A,但是用類型B去解析,從而導致嚴重後果 。
程序員無能。
有沒辦法避免這種問題?
有。換程序員。
1. void的作用a. 對函數參數的限定:當不需要傳入參數時,即
function (void);
b. 對函數返回值的限定:當函數沒有返回值時,即
void function(void);
2. void指針的作用
a. void指針可以指向任意的數據類型,即任意類型的指針可以賦值給void指針int *a;
void *p;
p=a;
如果void指針賦值給其他類型,則需要強制轉換;
a=(int *)p;
b. 在ANSI C標準中不允許對void指針進行算術運算,因為沒有特定的數據類型,即在內存中不知道移動多少個位元組;而在GNU標準中,認為void指針和char指針等同。
3. 應用
a.void指針一般用於應用的底層,比如malloc函數的返回類型是void指針,需要再強制轉換;b.文件句柄HANDLE也是void指針類型,這也是句柄和指針的區別;c.內存操作函數的原型也需要void指針限定傳入參數:void * memcpy (void *dest, const void *src, size_t len);
void * memset (void *buffer, int c, size_t num );
d. 面向對象函數中底層對基類的抽象。
還是有一些方法的,雖然都不完美。
比如Windows API許多結構第一個欄位是一個類似cbSize這樣的欄位,要求調用者必須賦值正確,否則就說明沒有被正確使用,直接返回錯誤。在調用者這一邊,可以使用防禦性的編程風格,比如在調用前加上這樣的判斷:ASSERT(IsWindow(hwnd));經驗和細心
我不百分之百了解的情況是不會做強制類型轉換的。實際上你說的問題沒法解決,自己都不知道是啥怎麼轉換?
lz一定是譚浩強看多了...
不會指針 老老實實寫java
可以試試用struct 包裝
北大青鳥課後補習班,真正提高程序猿的智商
所以發明了C#,java
推薦閱讀:
※如何理解C語言關鍵字restrict?
※C 語言中不同類型指針的大小是否完全相同,為什麼?
※指針的指針定義為什麼用int ** ptr,而不是int *ptr?
※C語言如何封裝printf函數?
※C語言結構體內部的函數指針有什麼意義?
TAG:C編程語言 |