C:允许将任何数组分配给指向不完整类型数组的指针

时间:2014-05-06 05:58:06

标签: c arrays ansi language-lawyer incomplete-type

以下似乎是C89中可疑的合法性。我无法弄清楚为什么允许它。我正在读标准和我的K& R2副本,但我仍然没有得到它。

char Arr[16];
char (*Durr)[] = &Arr; /*Why is this allowed?*/

真的是这样的。我需要C89标准的引用,告诉我为什么允许这样做。这不是一个C ++问题,它在那里肯定是非法的。谢谢!

编辑:这解释了标准中的问题:http://port70.net/~nsz/c/c89/c89-draft.html#3.3.16.1

1 个答案:

答案 0 :(得分:1)

char (*Durr)[] = &Arr;中的初始化要求Durr指向与Arr类型兼容的类型数组。

根据" 6.7.6.2数组声明符" (n1570)

  

6对于要兼容的两种数组类型,两者都应具有兼容的元素类型,如果   两个大小说明符都存在,并且是整数常量表达式,然后是两个大小    说明符应具有相同的常数值。

因为Durr指向的数组有一个未完成的类型,这意味着这两个类型应该是兼容的,所以编译器不应该为这个初始化提供错误/警告。