標籤:

在C語言中,如何安全地使用void*?

在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編程語言 |