我有一些遗留的 C 代码,其中包含以下行:
char line[max_line] = {NULL}
在 stddef.h 中,NULL 定义为:
#define NULL ((void*)0)
当尝试使用 icx 编译代码时,我收到有关使用“void *”类型的表达式初始化“char”的整数转换不兼容指针的错误
两个问题:
我尝试过:
char line[max_chars] = "";
编译成功,但我仍然对 {NULL} 的含义感到困惑
推测:这段代码是由某人编写的,他混淆了
NULL
宏(用于空指针常量)与空字符。
它可以在某些 C 实现中毫无抱怨地工作,因为 C 标准允许将
NULL
定义为 0
(或其他值为 0 的整数常量表达式)。所以代码是 char line[max_line] = {0}
,它将数组的第一个元素初始化为零(显式),其余元素初始化为零(默认)。 (末尾还应该有一个分号,或者声明的其他延续。)
在您的 C 实现中,
NULL
定义为 ((void*)0)
,这也是 C 标准所允许的。这种形式通常是更可取的,因为使 NULL
成为指针类型可以让编译器检测到一些错误,就像这里发生的那样。
- 我只见过 C 中使用大括号来描述代码块。 {NULL}是什么意思?
这是列出数组或结构的初始值的常规语法,如
int array[3] = { 1, 2, 3 };
所示。 (也可以选择使用大括号来初始化标量,如 int x = { 4 };
中所示。)
- 我应该如何修改代码来消除不兼容的指针转换错误?
将
NULL
更改为0
,或者,为了强调它是一个字符,'\0'
:char line[max_line] = { '\0' };
。像您一样使用 ""
也可以。