C memset警告
这是我的警告。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。
它是否正确操作
是的,它们具有相同的效果。编译器必须将NULL视为一个特殊的NULL指针(而一些更原始的编译器只是#define NULL 0
),而memset的第二个参数的类型为int
,所以通过将其更改为0,您使用的是空值,但满足int要求。
可能NULL定义为((void *)0)。两个版本都能正常工作,但第二种看起来更好 - memset需要一个数字而不是指针。
根据具体实现,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中用符号 表示的指针,该指针的实际位表示 是系统特定的 并且可以包含一位。
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
以外的任何整数也不会隐式转换为指针。在一致性模式下进行编译时
int i = 0;
int *p = i;
以上将触发警告:
最后,在下面的代码,即使i
具有价值0
,它是不是在分配的空指针常量p
。
(以上是有点离题,但我希望这不是完全题外话。)
的memset接受第二个参数为一个字符没有任何pointer.In你的第一个电话,你传递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"
这就是为什么它显示警告。
根据你使用的编译器,它会表现出来。 使用gcc会做出警告(关于数据类型转换),并会接受给定参数值以外的最接近可能的值。
当你的意思是0时不要使用NULL。 – 2010-03-10 06:11:42
NULL!= NUL(还有4个要去) – 2010-03-10 06:24:37