次のコードを検討してください (これは、この議論の結果として生まれました)。
#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 を拒否した場合、MSVC 2010 がエラーであることを誰か確認できますか?
1><snip>\prog.c(10): warning C4048: different array subscripts : 'int (*)[]' and 'int (*)[3]'