繁体   English   中英

C memset警告

[英]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 ,以下将pq设置为空指针:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM