2010-03-10 100 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会做出警告(关于数据类型转换),并会接受给定参数值以外的最接近可能的值。