指向具有不兼容行长度的2D数组的指针

时间:2017-10-11 12:03:43

标签: c pointers multidimensional-array

我尝试了以下代码

    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个元素。这不对吗?

1 个答案:

答案 0 :(得分:0)

您的编译器已损坏/配置不正确/不合规。

指向具有1个元素的数组的数组指针与指向5个元素的数组的数组指针不兼容。 C中简单赋值的规则表明有效的指针赋值必须是(C11 6.5.16.1强调我的):

  
      
  • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值后的类型)   转换)两个操作数都是限定或不合格的指针   兼容类型的版本,以及左侧指向的类型   右边指出的所有类型的限定符;
  •   

如果我们从引用的文本中删除所有正式标准术语,我们最终会用简单的英语结束:

=运算符的左操作数具有指针类型,并且两个操作数都是指向兼容类型的指针。

在您的代码中并非如此,因此它包含称为约束违规的内容,这意味着代码违反了C标准允许的内容。