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

Oma*_*mar 0 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 
}
Run Code Online (Sandbox Code Playgroud)

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

typedef struct SocialNetwork_t* SocialNetwork;
Run Code Online (Sandbox Code Playgroud)

SocialNetwork.c中的结构:

struct SocialNetwork_t {
    char *Name;
};
Run Code Online (Sandbox Code Playgroud)

为什么我会收到这个错误?

evn*_*vnu 5

当你定义你的结构SocialNetwork_t在实现文件SocialNetwork.c,编译器无法知道当编译该结构的内容User_Network.c,如果你只使用#include <SocialNetwork.h那里.编译器解析头文件SocialNetwork.h并知道它应该SocialNetwork_t稍后找到struct的定义,但是在编译dereference时不会遇到该定义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 
}
Run Code Online (Sandbox Code Playgroud)

当你的编译器编译它时,预处理器用这个文件的内容替换`#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
}
Run Code Online (Sandbox Code Playgroud)

这将是编译器启动实际编译时的完整文件.因此,当您尝试从中访问该Name字段时struct SocialNetwork,编译器没有看到结构,只看到指针类型的typedef.因此,它无法知道您实际指的是哪种类型.