我需要一位有权威来源的语言律师。
看看下面在 gcc 下编译干净的测试程序:
#include <stdio.h>
void foo(int *a) {
a[98] = 0xFEADFACE;
}
void bar(int b[]) {
*(b+498) = 0xFEADFACE;
}
int main(int argc, char **argv) {
int a[100], b[500], *a_p;
*(a+99) = 0xDEADBEEF;
*(b+499) = *(a+99);
foo(a);
bar(b);
printf("a[98] == %X\na[99] == %X\n", a[98], a[99]);
printf("b[498] == %X\nb[499] == %X\n", b[498], b[499]);
a_p = a+98;
*a_p = 0xDEADFACE;
printf("a[98] == %X\na[99] == %X\n", a[98], a[99]);
}
它产生我期望的输出:
anon@anon:~/study/test_code$ gcc arrayType.c -o arrayType
anon@anon:~/study/test_code$ ./arrayType
a[98] == FEADFACE
a[99] == DEADBEEF
b[498] == FEADFACE
b[499] == DEADBEEF
a[98] == DEADFACE
a[99] == DEADBEEF
a 和 b 是同一类型吗?被处理为与编译器内部 int *a
相同的类型?int a[]
从实际的角度来看,int a[100], b[500], *a_p, b_a[];
所有这些似乎都是同一类型。在我上面的例子中,我很难相信编译器会在各种情况下不断地调整这些类型。我很高兴被证明是错误的。
有人可以明确详细地为我解决这个问题吗?