Рассмотрим следующий код (это произошло в результате этого обсуждения):
#include <stdio.h>
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
).
Предположительно одно из следующего верно:
- Мое понимание стандарта (-ов) C неверно, и эти выражения не эквивалентны.
- У GCC есть ошибка.
Я бы поместил свои деньги (1).
Вопрос: Может ли кто-нибудь описать это поведение?
Разъяснение: Я знаю, что это можно "решить", указав размер массива в определении функции. Это не то, что меня интересует.
Для "бонусных" баллов: Может ли кто-нибудь подтвердить, что MSVC 2010 ошибочен, когда он отклоняет строку 10 со следующим сообщением?
1><snip>\prog.c(10): warning C4048: different array subscripts : 'int (*)[]' and 'int (*)[3]'