以下似乎是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
答案 0 :(得分:1)
char (*Durr)[] = &Arr;
中的初始化要求Durr
指向与Arr
类型兼容的类型数组。
根据" 6.7.6.2数组声明符" (n1570)
6对于要兼容的两种数组类型,两者都应具有兼容的元素类型,如果 两个大小说明符都存在,并且是整数常量表达式,然后是两个大小 说明符应具有相同的常数值。
因为Durr
指向的数组有一个未完成的类型,这意味着这两个类型应该是兼容的,所以编译器不应该为这个初始化提供错误/警告。