考虑以下声明:
int a[M][N]; // M and N are known compile-time
Run Code Online (Sandbox Code Playgroud)
如果它被宣布为:它是否合法对待它:
int a[N][M];
Run Code Online (Sandbox Code Playgroud)
甚至:
int a[A][B]; // where A * B = M * N
Run Code Online (Sandbox Code Playgroud)
在C中没有违反规则(严重)?
我发现它可以在没有任何演员阵容的情况下完成:
#include <stdio.h>
void print_array(int a[][2], int n);
int main(void)
{
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
//int (*p1)[2] = a; // compile error
int (*ptr_temp)[] = a; // pointer to array of incomplete type
int (*p2)[2] = ptr_temp; // compiles without any warning
print_array(p2, 3);
}
void print_array(int a[][2], int n)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < 2; j++)
printf("a[%d][%d] = %d\n", i, j, a[i][j]);
}
Run Code Online (Sandbox Code Playgroud)
请注意,我们不能分配a到p1直接指针.但是,编译器在p2分配时不会抱怨,ptr_temp即使它似乎有潜在危险(它不需要任何强制转换).它真的被消毒了吗?如果是这样,那为什么它不允许第一次转让呢?