[英]C memset warning
这是我的警告。
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。
这是正确的行动吗?
根据实现,C标准库有时将NULL定义为零整数(这将避免您看到的警告),但有时将NULL定义为零转换为void指针。 后一种实现会导致您看到的警告。
要回答您的具体问题,在这种情况下您不应该使用NULL。 无论实现如何,NULL都旨在用作空指针,而不是整数零的同义词。 如果要使用memset
用零填充内存块,则将零作为第二个参数传递,而不是NULL。
引自http://en.wikipedia.org/wiki/Stdlib.h :
空值
stdlib.h和stddef.h头文件定义宏NULL,它产生一个空指针常量,并表示一个指针值,保证不指向内存中的有效地址。
变种
NULL可以定义为等于int 0,long int zero或零转换为void *指针的常量表达式:
#define NULL 0
#define NULL 0L
#define NULL((void *)0)虽然空指针常量总是用C表示符号常量0或0表示为void指针,但这种指针的实际位表示是系统特定的,可能包含一位。
可能NULL定义为((void *)0)。 两个版本都正常工作,但第二个看起来更好 - memset需要一个数字而不是一个指针。
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;
以符合模式编译时,上述内容将触发警告。
(以上是一个题外话,但我希望它不完全偏离主题。)
是的,它们具有相同的效果。 编译器必须将NULL视为特殊的NULL指针(而一些更原始的编译器只是#define NULL 0
),而memset的第二个参数的类型为int
,所以通过将其更改为0,您使用的是null值但是满足int要求。
memset接受第二个参数作为一个字符而不是任何指针。在你的第一次调用中,你传递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"
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"
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将使警告(关于数据类型转换)并且将仅接受给定参数值之外的最接近的可用值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.