gpt4 book ai didi

c - 取消引用指向不完整类型的指针

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:50 25 4
gpt4 key购买 nike

我是 C 编程的新手,作为一个小型项目,我决定尝试在文件 GenericStack.h 中使用 OOP 样式结构在 C 中实现堆栈,如下所示:

void _GENERICSTACK0001(void *,void *);
void *_GENERICSTACK0002(void *);
int _GENERICSTACK0003(void *);

typedef struct
{
struct GenericStackNode *next;
void *data;
int type;
}GenericStackNode;

typedef struct
{
struct GenericStackNode *top;
int count;
void (*add)(void *,void *);
void *(*pop)(void *);
int (*hasNext)(void *);
int (*getCount)(void *);
}GenericStack;

GenericStack newGenericStack()
{
GenericStack *genStack = malloc(sizeof(GenericStack));
genStack->add = _GENERICSTACK0001;
genStack->pop = _GENERICSTACK0002;
genStack->hasNext = _GENERICSTACK0003;
genStack->getCount = _GENERICSTACK0003;
genStack->top=NULL;
genStack->count = 0;
return *genStack;
}

void _GENERICSTACK0001(void *self,void *data)//add
{
GenericStack *genStack = self;
if(genStack->top == NULL)
{
genStack->top = malloc(sizeof(GenericStackNode));
genStack->top->next = NULL;
genStack->top->type = 0;
genStack->top->data = data;
}
else
{
GenericStackNode *temp = malloc(sizeof(GenericStackNode));
temp->next = genStack->top;
temp->type = 0;
temp->data = data;
genStack->top = temp;
genStack->count++;
}
}

void *_GENERICSTACK0002(void *self)//pop
{
GenericStack *genStack = self;
void *data = NULL;
if(genStack->top == NULL)
{
return data;
}
else
{
GenericStackNode *temp = genStack->top;
genStack->top = genStack->top->next;
data = temp->data;
free(temp);
genStack->count--;
return data;
}
}

int _GENERICSTACK0003(void *self)
{
GenericStack *genStack = self;
return genStack->count;
}

我只需要知道为什么(除其他外)我会收到特定错误:

GenericStack.h:41:16: error: dereferencing pointer to incomplete type
genStack->top->type = 0;

我已经检查了 stackoverflow 上关于“取消引用不完整类型的指针”的其他答案,但我似乎无法理解。

最佳答案

GenericStack 出现错误,但 GenericStackGenericStackNode 都有问题。

在 C 中,struct XX 是不同的类型。当你写:

struct GenericStackNode *next;

它声明了一个名为 struct GenericStackNode 的类型(以及一个指向该类型的指针成员)。此类型不完整,因为您尚未提供结构定义。

稍后可以通过提供结构定义来完成类型,但您永远不会这样做。相反,您定义了一个未命名的结构和 typedef GenericStackNode 它,但这对 struct GenericStackNode 没有影响。

然后,struct GenericStackNode *top; 仍然使用相同的不完整类型,而不是您在上面定义的结构。

假设你的意思是这个指针是指向它所包含的相同类型结构的指针,你可以对你的两个结构使用这个模式:

typedef struct X X;

struct X
{
X *ptr;
};

人们通常将 typedef 与 struct 定义结合使用,但我发现将它们分开会更清楚。

关于c - 取消引用指向不完整类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30830079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com