在遗留 C 程序中奇怪地使用 { } 以及不兼容的指针转换

问题描述 投票:0回答:1

我有一些遗留的 C 代码,其中包含以下行:

char line[max_line] = {NULL}

在 stddef.h 中,NULL 定义为:

#define NULL ((void*)0)

当尝试使用 icx 编译代码时,我收到有关使用“void *”类型的表达式初始化“char”的整数转换不兼容指针的错误

两个问题:

  1. 我只见过 C 语言中使用大括号来描述代码块。 {NULL}是什么意思?
  2. 我应该如何修改代码来消除不兼容的指针转换错误?

我尝试过:

char line[max_chars] = "";

编译成功,但我仍然对 {NULL} 的含义感到困惑

c
1个回答
1
投票

推测:这段代码是由某人编写的,他混淆了

NULL
宏(用于空指针常量)与空字符。

它可以在某些 C 实现中毫无抱怨地工作,因为 C 标准允许将

NULL
定义为
0
(或其他值为 0 的整数常量表达式)。所以代码是
char line[max_line] = {0}
,它将数组的第一个元素初始化为零(显式),其余元素初始化为零(默认)。 (末尾还应该有一个分号,或者声明的其他延续。)

在您的 C 实现中,

NULL
定义为
((void*)0)
,这也是 C 标准所允许的。这种形式通常是更可取的,因为使
NULL
成为指针类型可以让编译器检测到一些错误,就像这里发生的那样。

  1. 我只见过 C 中使用大括号来描述代码块。 {NULL}是什么意思?

这是列出数组或结构的初始值的常规语法,如

int array[3] = { 1, 2, 3 };
所示。 (也可以选择使用大括号来初始化标量,如
int x = { 4 };
中所示。)

  1. 我应该如何修改代码来消除不兼容的指针转换错误?

NULL
更改为
0
,或者,为了强调它是一个字符,
'\0'
char line[max_line] = { '\0' };
。像您一样使用
""
也可以。

© www.soinside.com 2019 - 2024. All rights reserved.