代码之家  ›  专栏  ›  技术社区  ›  Antti Haapala -- Слава Україні

*当x是指向未定义维度数组的指针时,x与x[0]不同[duplicate]

  •  2
  • Antti Haapala -- Слава Україні  · 技术社区  · 6 年前

    我想 a[0] 相当于 *a ,但后来我遇到了这段代码:

    int arr[] = {1, 2, 3};
    int (* a)[] = &arr;
    printf("%d", (*a)[2]); // compiles
    printf("%d", a[0][2]); // errors out
    

    test.c:8:21: error: invalid use of array with unspecified bounds
         printf("%d", a[0][2]);
                         ^
    

    叮当声的错误是

    error: subscript of pointer to incomplete type 'int []'
    

    error C2036: 'int (*)[0]': unknown size
    

    为什么不呢 a[0] 相当于 *a ?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Community CDub    4 年前

    a[0] 完全等同于 *(a + 0) ( C11 6.5.2.1p2 ).

    对于 * C11 6.5.3.2p2

    1. 一元数的操作数 *

    哪一个 int (*)[] 是解引用的结果 (*a) int [] int * [2] ,结果为3。

    然而 a[0][2] 相当于 (*(a + 0))[2] + 操作员先申请! C11 6.5.6p2

    约束条件

    1. 对于加法,两个操作数中的任何一个都应具有算术类型, 另一个应为整数型。(增加等于增加1。)

    0 具有整数类型,并且 a 是指针,但它不是指向完整对象类型的指针,这意味着它与约束不匹配。

    由于此文本出现在约束部分,因此一致性编译器 必须 将此诊断为约束冲突。和往常一样,一致性实现仍然可以正确地翻译无效的程序,但至少GCC似乎会用一条错误消息彻底拒绝。