【问题标题】:c - dereferencing pointer to incomplete type - error with a pointer to a char*c - 取消引用指向不完整类型的指针 - 指向 char* 的指针出错
【发布时间】:2012-04-20 15:11:32
【问题描述】:

我在访问另一个结构中的 char* 时遇到问题,代码如下:

User_Network.c:

struct User_Networks_t {
    SocialNetwork network;
};

typedef struct User_Networks_t* User_Networks;


void aaa(User_Networks u1)
{
    u1->network->Name = "test";  /// ERROR: dereferencing pointer to incomplete type 
}

这是我在 SocialNetwork.h 中的内容:

typedef struct SocialNetwork_t* SocialNetwork;

SocialNetwork.c 中的结构:

struct SocialNetwork_t {
    char *Name;
};

为什么会出现这个错误?

【问题讨论】:

    标签: c pointers dereference


    【解决方案1】:

    当你在实现文件SocialNetwork.c中定义你的结构体SocialNetwork_t时,编译器在编译User_Network.c时无法知道结构体的内容>,如果你只在那里使用#include <SocialNetwork.h。编译器解析头文件 SocialNetwork.h 并知道它应该稍后找到结构 SocialNetwork_t 的定义,但在编译 void aaa(...) 中的取消引用时没有遇到该定义。因此,将完整的结构定义放入 SocialNetwork.h

    [更新] 我将详细说明该答案。我猜你的文件 User_Network.c 看起来像这样:

    #include "SocialNetwork.h"
    struct User_Networks_t {
        SocialNetwork network;
    };
    
    typedef struct User_Networks_t* User_Networks;
    
    
    void aaa(User_Networks u1)
    {
        u1->network->Name = "test";  /// ERROR: dereferencing pointer to incomplete type 
    }
    

    当您的编译器编译此文件时,预处理器会将 `#include "SocialNetwork.h" 替换为该文件的内容,从而为您提供:

    /* START content from the included file */
    typedef struct SocialNetwork_t* SocialNetwork;
    /* END */
    struct User_Networks_t {
        SocialNetwork network;
    };
    
    typedef struct User_Networks_t* User_Networks;
    
    
    void aaa(User_Networks u1)
    {
        u1->network->Name = "test";  /// The struct SocialNetwork is not defined here
    }
    

    这将是编译器开始实际编译时的完整文件。因此,当您尝试从struct SocialNetwork 访问Name 字段时,编译器看不到结构,而只看到指针类型的typedef。因此它无法知道您实际指的是哪种类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-22
      • 2018-05-31
      • 2017-11-02
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多