C语言 将指针类型转换为未定义的类型不会产生编译器错误

2ul0zpep  于 2023-03-07  发布在  其他
关注(0)|答案(2)|浏览(165)

我正在写一个套接字程序,我把struct sockaddr_in错误地输入为struct sockaddrr_in(注意一个额外的r),但是我没有收到任何编译器错误,只有incompatible-pointer-types警告。
下面是一个最小的可重复程序来演示这个问题。

#include <stdio.h>

struct Addr {
    int flat_no;
};

struct Person {
    struct Addr *address;
};

int main()
{
    struct Person p;
    struct Addr addr;
    p.address = &addr;
    struct Person *ptr = &p;
    struct Addr *a = (struct Addrr *)ptr->address; // struct Addr mistyped as Addrr
    printf("no error!!");
}

gccclang都生成此警告:

<source>:20:22: warning: initialization of 'struct Addr *' from incompatible pointer type 'struct Addrr *' [-Wincompatible-pointer-types]
   20 |     struct Addr *a = (struct Addrr *)ptr->address;
      |                      ^

由于struct Addrr在程序中从未定义过,编译器如何能够解决错误的符号?将ptr->address类型转换为未定义的类型struct Addrr会产生什么影响?

aiqt4smr

aiqt4smr1#

因为这个类型转换是struct Addrr第一次出现,所以它就像一个声明,这个类型是不完整的,因为它没有定义,但是你仍然可以创建一个指向不完整类型的指针。
因此,当您收到关于在不兼容的指针类型之间转换的警告时,您不会收到关于其他类型的错误。

0x6upsns

0x6upsns2#

强制转换运算符按以下方式定义

cast-expression:
    unary-expression
    ( type-name ) cast-expression

struct Addrr *是一个指针类型。指针类型总是完整类型。虽然被指向的类型struct Addrr是一个不完整类型。

相关问题