【问题标题】:C - compiler error: dereferencing pointer to incomplete typeC - 编译器错误:取消引用指向不完整类型的指针
【发布时间】:2018-10-23 12:24:18
【问题描述】:

我在这里看到了很多关于取消引用指向不完整类型的指针的问题,但每个问题都与不使用 typedef 或在 .c 中声明的结构有关,而不是在头文件中。我已经尝试解决这个问题好几个小时了,但似乎找不到办法。

stable.h(无法更改):

typedef struct stable_s *SymbolTable;

typedef union {
    int i;
    char *str;
    void *p;
} EntryData;

SymbolTable stable_create();

稳定的.c:

SymbolTable stable_create() {
    SymbolTable ht = malloc(sizeof (SymbolTable));
    ht->data = malloc(primes[0] * sizeof(Node));
    for (int h = 0; h < primes[0]; h++) ht->data[h] = NULL;
    ht->n = 0;
    ht->prIndex = 0;
    return ht;
}

aux.h:

#include "stable.h"

typedef struct {
    EntryData *data;
    char *str;
    void *nxt;
} Node;


typedef struct {
    Node **data;
    int n;
    int prIndex;
} stable_s;

typedef struct {
    char **str;
    int *val;
    int index;
    int maxLen;
} answer;

频率.c:

answer *final;
static void init(SymbolTable table){
    final = malloc(sizeof(answer));
    final->val = malloc(table->n * sizeof(int));
}

int main(int argc, char *argv[]) {
    SymbolTable st = stable_create();
    init(st);
}

编译器错误(使用标志 -Wall -std=c99 -pedantic -O2 -Wextra):

freq.c:13:30: error: dereferencing pointer to incomplete type ‘struct stable_s’
 final->val = malloc(table->n * sizeof(int));

【问题讨论】:

  • 请发送minimal reproducible example。您显示的代码不完整。我猜它背后的代码不可能引发所描述的错误。
  • 有一点要始终遵守。始终确保您需要的信息可用。 IE。包括任何声明您需要的任何标题的标题。您的 stable.h 与该规则不匹配。您的 .c 恰好包含在应该避免问题的顺序中(请参阅第一条评论),但这不是好的做法。
  • stable_create 函数泄漏内存,并取消引用未初始化的指针。 (T *p = malloc(...); return *p;),你复制分配的对象并且永远不会释放它。您不应该使用第一个 malloc(并使用 T p;)。这看起来很奇怪,因为指针类型定义很糟糕。
  • @M.M 我有一个 stable_destroy() 来释放内存,我没有包含它,因为它与错误无关;)

标签: c struct compiler-errors dereference


【解决方案1】:

这段代码

 typedef struct stable_s *SymbolTable;

SymbolTable 类型定义为指向struct stable_s 的指针。

这段代码

typedef struct {
    Node **data;
    int n;
    int prIndex;
} stable_s;

定义stable_s 类型的结构。注意stable_s 不是struct stable_s

一个简单的

struct stable_s {
    Node **data;
    int n;
    int prIndex;
};

没有typedef 将解决您的问题。

C : typedef struct name {...}; VS typedef struct{...} name;

【讨论】:

    【解决方案2】:

    正如 Andrew 指出的那样,声明一个“struct stable_s { ... }”将使事情编译。

    但是,您不会说这是课堂作业还是现实世界。如果在现实世界中,自己声明结构可能是一个非常糟糕的主意。你被赋予了一个不透明的类型来引用一个库;你不应该知道或访问里面的东西。该库依赖于您可能会弄乱的各种语义,并且随着软件版本的变化,结构的内容可能(并且几乎肯定会)发生变化,因此您的代码将来会中断。

    【讨论】:

    • 这是一项任务,我在 stable.h 中获得了 API,我应该在(与测试客户端一起)中实现。
    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 2018-05-31
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多