簡體   English   中英

C memset警告

[英]C memset warning

這是我的警告。

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。

這是正確的行動嗎?

根據實現,C標准庫有時將NULL定義為零整數(這將避免您看到的警告),但有時將NULL定義為零轉換為void指針。 后一種實現會導致您看到的警告。

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

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

空值

stdlib.h和stddef.h頭文件定義宏NULL,它產生一個空指針常量,並表示一個指針值,保證不指向內存中的有效地址。

變種

NULL可以定義為等於int 0,long int zero或零轉換為void *指針的常量表達式:

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

雖然空指針常量總是用C表示符號常量0或0表示為void指針,但這種指針的實際位表示是系統特定的,可能包含一位。

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

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以外的任何整數也不會隱式轉換為指針。

最后,在下面的代碼中,即使i的值為0 ,它在賦值給p也不是空指針常量:

int i = 0;
int *p = i;

以符合模式編譯時,上述內容將觸發警告。

(以上是一個題外話,但我希望它不完全偏離主題。)

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

memset接受第二個參數作為一個字符而不是任何指針。在你的第一次調用中,你傳遞NULL,這是一個指針指向C中的任何內容。這就是為什么,它給出了錯誤。在第二次調用中,你將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" 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" 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將使警告(關於數據類型轉換)並且將僅接受給定參數值之外的最接近的可用值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM