2010-03-10 99 views
3

這是我的警告。C memset警告

warning: passing argument 2 of ‘memset’ makes integer from pointer without a cast 

然後我改變如下(使NULL爲0)

Before Change : memset(key, NULL, KEY_BYTES); 
After Change : memset(key, 0, KEY_BYTES); 

該警告被移除。

我正在使用linux & gcc編譯器,C。

它是否正確操作

+4

當你的意思是0時不要使用NULL。 – 2010-03-10 06:11:42

+1

NULL!= NUL(還有4個要去) – 2010-03-10 06:24:37

回答

1

是的,它們具有相同的效果。編譯器必須將NULL視爲一個特殊的NULL指針(而一些更原始的編譯器只是#define NULL 0),而memset的第二個參數的類型爲int,所以通過將其更改爲0,您使用的是空值,但滿足int要求。

+0

'#define NULL 0'不是「更原始的」。這是C++標準,在C++中甚至不允許使用'(void)0'。在C中,'(void)0'更符合/更符合標準。 – sbi 2010-03-10 06:14:55

+1

@sbi你錯過了一個星號:(void *)0 – 2010-03-10 09:54:28

+0

@Charlie:當然。對不起,這個愚蠢的錯誤。不過,我認爲我是對的,但。 – sbi 2010-03-10 17:14:26

3

可能NULL定義爲((void *)0)。兩個版本都能正常工作,但第二種看起來更好 - memset需要一個數字而不是指針。

13

根據具體實現,C標準庫有時將NULL定義爲零整數(這可以避免您看到的警告),但有時將NULL定義爲零投射到void指針。後一種實現會導致您看到的警告。

要回答你的具體問題,你不應該在這種情況下使用NULL。無論實現如何,NULL都被用作空指針,而不是整數零的同義詞。如果你想用memset來填充一個內存塊爲零,那麼傳遞零作爲第二個參數,而不是NULL。

http://en.wikipedia.org/wiki/Stdlib.h引用:

NULL

的stdlib.h中和STDDEF.H頭文件定義 宏NULL,這產生一個空指針 常數,代表一個指針值 保證不指向內存中有效的 地址。

變體

NULL可以被定義爲一個 常量表達式等於爲int爲零, 長整型零或零澆鑄到空隙 *指針:

的#define NULL 0
#define NULL 0L
#define NULL((void *)0)

雖然空指針常量總是在C中用符號 表示的指針,該指針的實際位表示 是系統特定的 並且可以包含一位。

3

memset的第二個參數是int類型。NULL是C中的空指針恆定根據標準:

一個整數常量表達式用值0,或者這樣轉換爲類型void *一個表達式,被稱爲空指針恆定

因此,NULL可以被定義爲(void *)0或等同物。在這種情況下,您的memset調用是錯誤的,因爲您正在將指針轉換爲整數。

另一種方式是好的:如果您使用0(其中需要空指針),編譯器將爲您執行轉換。所以,對於一個類型T,以下設置既pq空指針:

T *p = NULL; 
T *q = 0; 

而且,給定一個指針p,以下是等價的:

if (p) ... 
if (p != NULL) ... 
if (p != 0) ... 

這是因爲0是特殊:在指針上下文中,它會自動轉換爲空指針常量。另一方面,指針永遠不會隱式轉換爲整數。除0以外的任何整數也不會隱式轉換爲指針。在一致性模式下進行編譯時

int i = 0; 
int *p = i; 

以上將觸發警告:

最後,在下面的代碼,即使i具有價值0,它是不是在分配的空指針常量p

(以上是有點離題,但我希望這不是完全題外話。)

0

的memset接受第二個參數爲一個字符沒有任何pointer.In你的第一個電話,你傳遞NULL這是一個指針,指向C中什麼也沒有。這就是爲什麼,它給了錯誤。在第二次調用中,你將0字節分配給給定的內存。

0

當使用memset(key, NULL, KEY_BYTES); NULL is the (void*)0 {ie; void* typecasted of int zero}. and the memset 2nd argument should be of type "unsigned int" 這就是爲什麼它顯示警告。

根據你使用的編譯器,它會表現出來。 使用gcc會做出警告(關於數據類型轉換),並會接受給定參數值以外的最接近可能的值。