gpt4 book ai didi

C struct typedef 和声明导致指针错误

转载 作者:行者123 更新时间:2023-11-30 18:36:51 25 4
gpt4 key购买 nike

我已尝试并尽可能地提取以下代码:

#include <stdlib.h>

typedef struct item{
struct item *next;
}item;

void addItem(item *list)
{
item *newItem = list;
while(newItem->next != NULL){
newItem = newItem->next;
}

newItem->next = malloc(sizeof(item));
newItem->next->next = NULL;
}

int main()
{
item *groceryList = NULL;
groceryList = malloc(sizeof(item));
if(groceryList == NULL)
return 1;
groceryList->next = NULL;

addItem(groceryList);

return 0;
}

这编译得很好。但将结构声明更改为(或更改的任意组合):

typedef struct{ /*Removed "item"*/
item *next; /*Removed "struct"*/
}item;

编译时出现以下错误:

structpointertest.c:11:11: warning: assignment from incompatible pointer type structpointertest.c:15:15: error: request for member 'next' in something not a structure or union

我不明白结构声明中的什么导致了这个问题?这与我使用嵌套结构有关吗?

谢谢。

最佳答案

在 C 中,您必须先声明事物,然后才能使用它们。当你这样做时

typedef struct item { ... }

struct item 部分是一个声明,告诉编译器存在一个结构名称 item。这意味着您可以稍后使用它,甚至在结构内部定义指向自身的指针。

当你这样做时

typedef struct { ... } item;

您没有为结构指定名称,并且类型别名 item 是在结构之后声明的,因此它不能在结构内部使用。

简单的解决方案是使用第一种方式。另一种解决方案是在结构体之前声明类型别名,例如

typedef struct item item;
struct item
{
item *next; // Can use type-alias, as it has been declared up above
};

无论哪种方式,您仍然必须为结构本身命名。

另请注意,struct item *next;(或 item *next;)声明一个成员变量,该变量是指向该结构的指针 ,它不是递归嵌套的实际结构本身。创建一个指向尚未完全定义的内容的指针是可以的。

关于C struct typedef 和声明导致指针错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40024831/

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