C memset警告

时间:2010-03-10 05:54:44

标签: c warnings

这是我的警告。

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。

这是正确的行动

6 个答案:

答案 0 :(得分:13)

根据实现,C标准库有时将NULL定义为零整数(这将避免您看到的警告),但有时将NULL定义为零转换为void指针。后一种实现会导致您看到的警告。

要回答您的具体问题,在这种情况下您不应该使用NULL。无论实现如何,NULL都旨在用作空指针,而不是整数零的同义词。如果要使用memset用零填充内存块,则将零作为第二个参数传递,而不是NULL。

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

  

NULL

     

stdlib.h和stddef.h头文件定义   宏NULL,产生空指针   常量,并表示指针值   保证不指向有效   记忆中的地址。

     

变种

     

NULL可以定义为a   常量表达式等于int零,   long int零,或零转换为void   *指针:

     

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

     

虽然空指针常量总是如此   用符号表示在C中   常数0或0转换为空白   指针,实际位表示   这种指针是特定于系统的   并且可以包含一位。

答案 1 :(得分:3)

可能NULL定义为((void *)0)。两个版本都能正常工作,但第二个看起来更好 - memset需要一个数字,而不是一个指针。

答案 2 :(得分: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以外的任何整数也不会隐式转换为指针。

最后,在下面的代码中,即使i的值为0,它在p的赋值中也不是空指针常量:

int i = 0;
int *p = i;

以符合模式编译时,上述内容将触发警告。

(上面的内容有点偏离,但我希望它不是完全偏离主题的。)

答案 3 :(得分:1)

是的,它们具有相同的效果。编译器必须将NULL视为特殊的NULL指针(而一些更原始的编译器只是#define NULL 0),而memset的第二个参数的类型为int,因此将其更改为0您正在使用null值但满足int要求。

答案 4 :(得分:0)

memset接受第二个参数作为一个字符而不是任何指针。在第一次调用时,你传递NULL,这是一个指向C中没有任何内容的指针。这就是为什么,它给出了错误。在第二次调用中,你指的是0字节到给定的内存。

答案 5 :(得分: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将发出警告(关于数据类型转换),并且只接受给定参数值中最接近的可用值。