这是我的警告。
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。
这是正确的行动
答案 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
,以下内容将p
和q
都设置为空指针:
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将发出警告(关于数据类型转换),并且只接受给定参数值中最接近的可用值。