我尝试了以下代码
char arr[5] = {'A', 'E', 'I', 'O', 'U'};
char (*p_arr)[1] = &arr;
printf("%c\n", p_arr[0][4]); //returns 'U'
为什么没有任何错误,因为
char (*p_arr)[1] = &arr;
似乎是来自不兼容类型(char (*)[5]
而不是必需char (*)[1]
)的初始化?此外,p_arr[0][4]
要求数组的第5个元素应该只有1
个元素。这不对吗?
答案 0 :(得分:0)
您的编译器已损坏/配置不正确/不合规。
指向具有1个元素的数组的数组指针与指向5个元素的数组的数组指针不兼容。 C中简单赋值的规则表明有效的指针赋值必须是(C11 6.5.16.1强调我的):
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值后的类型) 转换)两个操作数都是限定或不合格的指针 兼容类型的版本,以及左侧指向的类型 右边指出的所有类型的限定符;
如果我们从引用的文本中删除所有正式标准术语,我们最终会用简单的英语结束:
=运算符的左操作数具有指针类型,并且两个操作数都是指向兼容类型的指针。
在您的代码中并非如此,因此它包含称为约束违规的内容,这意味着代码违反了C标准允许的内容。