无法使用指针数组编译C89

时间:2019-08-02 02:50:05

标签: c arrays pointers c89

我正在尝试编译我的C89代码,其中包括一个指向各种其他数组中位置的指针的数组。我一直得到ERROR (207) Aggregate or union objects may be initialized with constant expressions only,可能是因为我在初始化时如何定义它,但是除了一次定义一个索引之外,我实际上没有更好的方法,我希望避免。我已经尝试了所有可以想到的方法,是否有任何方法可以一次定义一行?

uint8_t * keyPtrs[] = {
    towers,
    towers,
    *(towers + 1),
    *(towers + 1),
    *(towers + 2),
    *(towers + 2),
    allianceStack
};

2 个答案:

答案 0 :(得分:2)

在C89中,数组的初始化程序必须在编译时可计算。 See here以获得更详细的定义。

在语言标准的更高版本中,对自动数组放宽了此要求(对于静态数组则放宽了此要求)。

您将不得不使用赋值语句,否则,将填充直到运行时才知道的值。

答案 1 :(得分:1)

如果该数组应该标识静态数组towers中的元素,则正确的语法应为:

uint8_t * keyPtrs[] = {
    towers,
    towers,
    towers + 1,
    towers + 1,
    towers + 2,
    towers + 2,
    allianceStack
};

如果towersallianceStack都是具有静态持续时间的数组对象,则该数组中使用的地址应该是静态可计算的。可能有一些针对晦涩的链接器的编译器可能不支持(ptrConst+intConst)表达式的静态计算,但是您在这里的问题几乎可以肯定是不正确的星号。