【发布时间】: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