首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C memset警告

C memset警告
EN

Stack Overflow用户
提问于 2010-03-10 13:54:44
回答 6查看 3.8K关注 0票数 3

这是我的警告。

代码语言:javascript
运行
复制
warning: passing argument 2 of ‘memset’ makes integer from pointer without a cast

然后我按如下方式进行了更改(将NULL设为0)

代码语言:javascript
运行
复制
Before Change : memset(key, NULL, KEY_BYTES);
After Change : memset(key, 0, KEY_BYTES);

警告将被删除。

我使用的是linux & gcc编译器,C。

这是正确的操作吗

EN

回答 6

Stack Overflow用户

发布于 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转换为空指针表示,但此类指针的实际位表示是系统特定的,并且可能包含一位。

票数 13
EN

Stack Overflow用户

发布于 2010-03-10 14:00:04

可能的NULL定义为((void*)0)。两个版本都可以正常工作,但第二个版本看起来更好- memset需要一个数字而不是一个指针。

票数 3
EN

Stack Overflow用户

发布于 2010-03-10 14:17:30

memset的第二个参数的类型为intNULL是C中的空指针常量。根据标准:

将值为0的整数常量表达式转换为void *类型的表达式称为

指针常量。

因此,可以将NULL定义为(void *)0或等效项。在这种情况下,您的memset调用是错误的,因为您正在将指针转换为整数。

另一种方式也可以:如果在需要空指针的地方使用0,编译器将为您进行转换。因此,在给定类型T的情况下,下面的代码将pq都设置为空指针:

代码语言:javascript
运行
复制
T *p = NULL;
T *q = 0;

此外,在给定指针p的情况下,以下内容是等效的:

代码语言:javascript
运行
复制
if (p) ...
if (p != NULL) ...
if (p != 0) ...

这是因为0是特殊的:在指针上下文中,它会自动转换为null指针常量。另一方面,指针永远不会隐式转换为整数。除0以外的任何整数也永远不会隐式转换为指针。

最后,在下面的代码中,尽管i的值为0,但在对p的赋值中,它不是空指针常量

代码语言:javascript
运行
复制
int i = 0;
int *p = i;

在符合模式下编译时,上面的代码会触发一个警告。

(上面有点离题,但我希望它不是完全离题的。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2414827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档