c - 取消引用指向不完整类型的指针 - 带有指向char *的指针的错误

时间:2012-04-20 15:11:32

标签: c pointers dereference

我在访问另一个结构中的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;
};

为什么我会收到错误?

1 个答案:

答案 0 :(得分:5)

在实现文件 SocialNetwork.c 中定义结构SocialNetwork_t时,编译器在编译 User_Network.c <时无法知道结构的内容。 / strong>,如果你只使用#include <SocialNetwork.h那里。编译器解析头文件 SocialNetwork.h 并知道它应该稍后找到struct SocialNetwork_t的定义,但是在编译{{1中的解除引用时不会遇到该定义}}。因此,将完整的结构定义放入 SocialNetwork.h

[更新] 我会详细说明这个答案。我猜您的文件 User_Network.c 如下所示:

void aaa(...)

当你的编译器编译它时,预处理器用这个文件的内容替换`#include“SocialNetwork.h”,它给你:

#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 
}

这将是编译器启动实际编译时的完整文件。因此,当您尝试从/* 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 } 访问Name字段时,编译器没有看到结构,只看到指针类型的typedef。因此,它无法知道您实际指的是哪种类型。