答案 0 :(得分:5)
C90标准说(见§6.5.7):
初始值设定项中具有静态存储持续时间的对象中的所有表达式 具有聚合或联合类型的对象的初始化列表应为常量表达式。
在上下文中,p
'具有聚合类型',a
的数组元素的地址不是常量,因此C90表示不允许初始化。这就是你的编译器拒绝该代码的原因。
C99放松了这种限制。相应的段落(§6.7.8¶4)说:
具有静态存储持续时间的对象的初始值设定项中的所有表达式都应为 常量表达式或字符串文字。
帮自己一个忙,并获得一个可以追溯到当前千禧年的编译器 - 如果可能的话,应该是一个实现C11的编译器。
答案 1 :(得分:3)
信不信由你,但问题实际上是你的超级古老的编译器。代码很好。只需使用新的编译器。今天大多数编译器都是免费的,而且非常小,可以下载。所以考虑升级到gcc或MSVC。