了解二维数组初始化

时间:2014-02-20 21:43:40

标签: c

我遇到了以下代码,但我不知道为什么会这样做。有人可以向我解释一下吗?

char *MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_END_ALL+1] = {
    [MPIDI_CH3_PKT_EAGER_SEND] = "MPIDI_CH3_PKT_EAGER_SEND",
    [MPIDI_CH3_PKT_EAGER_SEND_CONTIG] = "MPIDI_CH3_PKT_EAGER_SEND_CONTIG",
};

扎克

2 个答案:

答案 0 :(得分:1)

这只是使用指定的初始值设定项,如问题Designated initializers and omitted elements中所示。例如,

const char *foo[42] = {[1] = "hello", [2] = "world"};

问题中给出的代码似乎是一种将常量字符串化的方法。

答案 1 :(得分:1)

你必须声明一个char *指针数组。你有两个显式常量 - MPIDI_CH3_PKT_EAGER_SENDMPIDI_CH3_PKT_EAGER_SEND_CONTIG - 有一些你不应该“知道”的值。现在,您希望创建索引为MPIDI_CH3_PKT_EAGER_SENDMPIDI_CH3_PKT_EAGER_SEND_CONTIG的元素以指向相应的字符串文字值(并将所有其他数组元素保留为空指针)。

你怎么能这样做?

在C89 / 90中,您可以先将所有内容初始化为空,然后使用赋值将正确的元素设置为正确的值

char *MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_END_ALL+1] = { 0 };
MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_EAGER_SEND] = "MPIDI_CH3_PKT_EAGER_SEND";
MPIDI_CH3_Pkt_type_to_string[MPIDI_CH3_PKT_EAGER_SEND_CONTIG] = "MPIDI_CH3_PKT_EAGER_SEND_CONTIG";

在C99中,您可以使用设计的初始化程序功能在初始化中执行相同的操作,作为单行程序,这正是您的示例中所做的。

所以,你的“为什么”问题的答案是:因为你的声明中使用的语言功能正是用户想要做的。没有其他答案。

P.S。这里真正的“为什么”问题是他们使用char *指针指向字符串文字(而不是const char *指针)的原因。这是一个非常大的“为什么”。