这是我的警告。
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。
这是正确的操作吗
发布于 2010-03-10 14:00:57
根据实现的不同,C标准库有时将NULL定义为零整数(这将避免您看到的警告),但有时将NULL定义为转换为空指针的零。后一种实现会导致您看到的警告。
要回答您的特定问题,在这种情况下不应使用NULL。无论采用哪种实现方式,NULL都应用作空指针,而不是整数零的同义词。如果您想使用memset
用零填充内存块,那么传递零作为第二个参数,而不是NULL。
引用自http://en.wikipedia.org/wiki/Stdlib.h:
空
stdlib.h和stddef.h头文件定义宏NULL,该宏将生成null指针常量,并表示保证不指向内存中有效地址的指针值。
变体
NULL可以定义为等于int零、long int零或零的常量表达式,并转换为void *指针:
#定义NULL %0
#定义NULL 0L
#define NULL ((void *) 0)虽然null指针常量在C中始终由符号常量0或0转换为空指针表示,但此类指针的实际位表示是系统特定的,并且可能包含一位。
发布于 2010-03-10 14:00:04
可能的NULL定义为((void*)0)。两个版本都可以正常工作,但第二个版本看起来更好- memset需要一个数字而不是一个指针。
发布于 2010-03-10 14:17:30
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
是特殊的:在指针上下文中,它会自动转换为null指针常量。另一方面,指针永远不会隐式转换为整数。除0
以外的任何整数也永远不会隐式转换为指针。
最后,在下面的代码中,尽管i
的值为0
,但在对p
的赋值中,它不是空指针常量
int i = 0;
int *p = i;
在符合模式下编译时,上面的代码会触发一个警告。
(上面有点离题,但我希望它不是完全离题的。)
https://stackoverflow.com/questions/2414827
复制相似问题