为什么struct可以包含指向另一个未定义的结构的指针?

时间:2016-12-14 04:23:01

标签: c pointers struct

int main(void)
{
    struct a
    {
        struct b* x;
    };
}

我将struct a定义为包含指向x的指针struct b,而不定义struct b。我期待一个错误。即使包括-Wall,我也没有从编译器中获得任何东西。对此有解释吗?

3 个答案:

答案 0 :(得分:2)

你拥有的是incomplete type,拥有这种类型的指针是完全没问题的,但除非你完成它,否则无法实例化。

  

2.7不完整类型

     

您可以在不列出的情况下定义结构,联合和枚举   他们的成员(或在枚举的情况下的价值观)。这样做   导致类型不完整。你不能声明变量   不完整的类型,但您可以使用指向这些类型的指针。

struct point {
    int x, y;
};
     

稍后在您的程序中,您将需要完成该类型。   你可以像往常一样定义它:

struct singly_linked_list   {
    struct singly_linked_list *next;
    int x;
    /* other members here perhaps */
};
struct singly_linked_list *list_head;
     

此技术通常用于链接列表:

        $('#collapse3').click(function(e){
        e.preventDefault();
        $.ajax({
            type: "GET",
            url:"<?php  echo $plugin->dispatchRequest("saleshome/index",array('lat' => $latitude,'lng'=>$longitude)); ?>",
            data: { },
            success: function(data){
                $('#collapse3_res').html(data);
            }
        });
    });

答案 1 :(得分:2)

这只是一种标准语言功能。 struct b现在是一个不完整的类型。对于不完整类型,你可以做的不多。但是可以做的一件事就是声明指向不完整类型的指针。

稍后您可以通过提供struct b的完整声明来完成该类型。之后它将成为正常的结构类型。

答案 2 :(得分:0)

因为编译器可以分配结构,因为它知道指针的大小,但你不能使用x,因为除非有结构的定义,否则编译器不会知道如何取消引用指针。

您可以通过使用前向声明来利用此功能,您可以声明一个未知struct类型的指针,并避免仅为结构包含可能的大型头文件,从而改进编译时间和精力。