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

時間 2021-05-11 20:39:33

1樓:Lvcs

靈活接收資料型別,可以試試使用巨集定義而不用函式:

舉個例子:判斷兩個數哪個大

#define MAX(a, b) ((a) > (b) ? (a) : (b))

使用巨集定義可以靈活接收各種型別的 a、b,而使用函式判斷的話就需要事先設定傳入引數的型別了。

2樓:劉燦

傳遞指標同時提供區域長度

不用0來標識字串或區域結束

以typdef struct *來定義型別少搞變長字段,union比巢狀void*強,按頁分配比碎片記憶體強

3樓:Deeper Go

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

,intc,

size_t

num);

d. 物件導向函式中底層對基類的抽象。

4樓:shuhari

還是有一些方法的,雖然都不完美。

比如Windows API許多結構第乙個欄位是乙個類似cbSize這樣的字段,要求呼叫者必須賦值正確,否則就說明沒有被正確使用,直接返回錯誤。

在呼叫者這一邊,可以使用防禦性的程式設計風格,比如在呼叫前加上這樣的判斷:

ASSERT(IsWindow(hwnd));

5樓:薛非

void*因為可以靈活地接收任何資料型別

沒這個事情。

傳遞了型別A,但是用型別B去解析,從而導致嚴重後果 。

程式設計師無能。

有沒辦法避免這種問題?

有。換程式設計師。

怎麼使用c語言中的sort排序,在結構體裡面按學號排序??

陳舸 問題描述的不是很清楚,不過我大概猜你是想對某些結構體做排序,結構體裡有個學號的字段,要以學號為標準來排序?可以使用qsort 隨手碼了乙份。include include include typedef struct student Student int compare const void...

C 語言中如何盡量簡單地用 while 語句求 1 到 10 的階乘?

如果你的模數不是質數的話,請先拆成質數的整次冪。然後對於每乙個整次冪,用 exLucas 裡面提到的遞推方法解出在這一整次冪下的階乘結果。隨後只需要用 CRT 合併即可。由於題主沒有貼出模數,所以我沒法寫出更詳細的過程。 靜水流深MXY include intmain return0 墨黎 whil...

C 語言中如何優雅地拼接多段字串?

湛藍水晶 用sprintf strcat在設計之初是考慮了鏈式呼叫的,所以返回的是源位址,於是可以用 strcat strcat strcat strcat strcat strcat strcat strcat dest TEST1 ip TEST2 port TEST3 name TEST4 n...