是"重新格式化"通过指向C中允许的不完整数组类型的多维数组?

时间:2015-07-15 23:40:53

标签: c c11

请考虑以下声明:

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时编译器不会抱怨,即使它似乎有潜在危险(它不需要任何强制转换)。它真的被消毒了吗?如果是这样,为什么它不允许第一次转让呢?

1 个答案:

答案 0 :(得分:1)

您看到的行为是因为在C中处理多维数组的方式。

看一下这个问题Pointer address in a C multidimensional array