C - 指针分配二维数组指针的警告消息



我编写了一个程序来在运行时读取数组元素,然后它根据某些配置更改列。

我从GCC cygwin编译器收到以下警告消息:

pointer.c:73: error: incompatible types in assignment

考虑下面的代码,如何删除此警告?

提前感谢您的帮助

typedef struct INPUT_ST
{
    float a;
    float b;
    float c;
}INPUT;
const INPUT lookup[3][3];
main()
{
    INPUT *ptr;
    /*typedef INPUT (st[3][3]);*/
    INPUT (*ptr1)[3][3];
    int i, j;
    ptr = (INPUT *)&lookup;
    (*ptr1)[3][3] = &lookup[0][0];
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
        {
            printf("Row %d and column %d:n", i, j);
            printf("%fn", (*ptr1)[i][j].a);
            printf("%fn", (*ptr1)[i][j].b);
            printf("%fnn", (*ptr1)[i][j].c);
        }
        printf("n");
    }
}

导致错误的行如下:

(*ptr1)[3][3] = &lookup[0][0];

原因是作业的左侧和右侧具有不兼容的类型。

左侧ptr1的类型为 INPUT (*)[3][3](指向 3x3 INPUT数组的指针(。 (*ptr1)[3][3]的类型为 INPUT(取消引用(未初始化的(指针,然后访问(越界(元素[3][3](。 右侧的lookup类型为 const INPUT [3][3](3x3 const INPUT数组(。这使得&lookup[0][0]属于类型 const INPUT *(元素的地址 [0][0] (。所以类型是冲突的:INPUT vs. const INPUT * .

您真正要做的是使ptr1指针指向数组lookup。因此,您需要将const添加到指针声明中,然后按如下方式对其进行初始化:

const INPUT (*ptr1)[3][3];
// ...
ptr1 = &lookup;

您对 ptr 的部分解决方案不起作用,因为它是一个常规指针(单维(,因此您无法访问 ptr[i][j] ,这意味着取消引用不是指针INPUT(但您可以访问ptr[i*3+j]而不是ptr[i][j](。顺便说一句,与其像ptr那样抛弃const,不如真正宣布ptr const INPUT *ptr;.