Эквивалентность p[0] и *p для типов неполных массивов

Рассмотрим следующий код (it появилось в результате этого обсуждения):

#include 

void foo(int (*p)[]) {          // Argument has incomplete array type
    printf("%d\n", (*p)[1]);
    printf("%d\n", p[0][1]);    // Line 5
}

int main(void) {
    int a[] = { 5, 6, 7 };
    foo(&a);                    // Line 10
}

GCC 4.3.4 жалуется с сообщением об ошибке:

prog.c: In function ‘foo’:
prog.c:5: error: invalid use of array with unspecified bounds

То же сообщение об ошибке в GCC 4.1.2 и, похоже, не отличается от -std=c99, -Wall, -Wextra.

Таким образом, ему не нравится выражение p[0], но он доволен *p, хотя они должны (теоретически)быть эквивалентными. Если я закомментирую строку 5, код скомпилируется и сделает то, что я "ожидаю" (отобразит6).

Предположительно верно одно из следующего.:

  1. Мое понимание стандарта C(s)неверно, и эти выражения не эквивалентны.
  2. Ошибка в GCC.

Я бы поставил деньги на (1).

Вопрос:Кто-нибудь может рассказать об этом поведении?

Пояснение:Я знаю, что это можно "решить", указав размер массива в определении функции. Это не то, что меня интересует.


Для «бонусных» баллов:Кто-нибудь может подтвердить, что MSVC 2010 ошибается, когда отклоняет строку 10 со следующим сообщением?

1>\prog.c(10): warning C4048: different array subscripts : 'int (*)[]' and 'int (*)[3]'

19
задан Community 23 May 2017 в 12:25
поделиться