C 内存集警告

C 内存集警告,c,warnings,C,Warnings,这是我的警告 warning: passing argument 2 of ‘memset’ makes integer from pointer without a cast 然后我做了如下更改(将NULL设为0) 警告已删除 我正在使用linux和gcc编译器,C 是的,它们有同样的效果。编译器必须将NULL视为一个特殊的NULL指针(而一些更原始的编译器只是定义NULL 0),并且的第二个参数的类型为int,因此将其更改为0,即使用NULL值,但满足int要求。可能将NULL定义为((v

这是我的警告

warning: passing argument 2 of ‘memset’ makes integer from pointer without a cast
然后我做了如下更改(将NULL设为0)

警告已删除

我正在使用linux和gcc编译器,C


是的,它们有同样的效果。编译器必须将NULL视为一个特殊的NULL指针(而一些更原始的编译器只是定义NULL 0),并且的第二个参数的类型为
int
,因此将其更改为0,即使用NULL值,但满足int要求。

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

根据具体实现,C标准库有时将NULL定义为零整数(这可以避免您看到的警告),但有时将NULL定义为空指针中的零。后一种实现会导致您看到的警告

为了回答您的特定问题,在本例中不应使用NULL。无论实现如何,NULL都将用作NULL指针,而不是整数零的同义词。如果要使用
memset
用零填充内存块,请将零作为第二个参数传递,而不是NULL

引述自:

NULL

stdlib.h和stddef.h头文件定义 宏NULL,它产生一个NULL指针 常量,并表示 保证不会指向有效的 内存中的地址

变体

NULL可以定义为 常数表达式等于int零, 长整型零,或零转换为空 *指针:

#定义空值0
#定义空0L
#定义空((void*)0)

尽管null指针常量始终为 用C表示的符号 常量0或按0转换为空 指针,实际的位表示形式 这种指针的类型是系统特定的 并且可能包含一个位


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;
在符合模式下编译时,上述内容将触发警告


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

memset接受第二个参数作为字符,而不是任何指针。在第一次调用中,您传递NULL,它是C中不指向任何内容的指针。这就是为什么,它给出了错误。在第二次调用中,您正在为给定的内存分配0个字节。

当使用
memset(key,NULL,key\u bytes)时;
NULL是(void*)0{ie;void*类型转换为int zero}。
memset第2个参数的类型应为“unsigned int”
这就是它发出警告的原因

根据您使用的编译器,它的行为将有所不同。
使用gcc将发出警告(关于数据类型转换),并且只接受给定参数值中最接近的可用值。

当您表示0时,不要使用NULL。
#define NULL 0
不是“更原始”。这是C++标准,C++中不允许代码>(空)0 < /代码>。在C语言中,
(void)0更常用/更符合标准。@sbi您缺少一个星号:(void*)0@Charlie:当然可以。为那个愚蠢的错误感到抱歉。否则我想我是对的。
int i = 0;
int *p = i;