请考虑以下声明:
int a[M][N]; // M and N are known compile-time
将它视为声明为:
是否合法int a[N][M];
甚至:
int a[A][B]; // where A * B = M * N
在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]);
}
请注意,我们无法直接将a
指定给p1
指针。但是,p2
分配ptr_temp
时编译器不会抱怨,即使它似乎有潜在危险(它不需要任何强制转换)。它真的被消毒了吗?如果是这样,为什么它不允许第一次转让呢?