C 如何在没有警告的情况下返回正确的数据类型
我正在尝试构建自己的链表数据结构,但有一件事让我遇到了麻烦:我不知道如何返回一个结构数据类型,该结构数据类型在指针中的值为NULL。 例如:C 如何在没有警告的情况下返回正确的数据类型,c,linked-list,return,C,Linked List,Return,我正在尝试构建自己的链表数据结构,但有一件事让我遇到了麻烦:我不知道如何返回一个结构数据类型,该结构数据类型在指针中的值为NULL。 例如: item pophead(node *list) { head = list; node *newlist = (node *) malloc(sizeof(node*)); item result; if(!list) { perror("There is nothing to be pop\n")
item pophead(node *list)
{
head = list;
node *newlist = (node *) malloc(sizeof(node*));
item result;
if(!list)
{
perror("There is nothing to be pop\n");
return;
}
else
{
newlist = list->next;
result = list->data;
free(list);
list = newlist;
}
return result;
}
这是我从链表顶部弹出一个项目的程序。问题是在第一种情况下检查列表是否为空,所以我希望我的程序什么也不返回,但是当我这样写时,它会收到一条警告消息
我想添加
item
这里是一个结构数据类型,而不是像int
或char
这样的单一数据类型,除非返回newlist
您需要传递列表
的地址,例如项目pophead(节点**列表)
,这样您就可以对原始指针而不是副本进行操作。为什么?C是传递值,当您将变量作为参数传递时,函数将接收变量的副本。您在函数中所做的任何更改都将在返回时丢失
为了避免这种情况,您可以传递参数的地址,虽然函数仍将接收指针的副本,但它将包含原始地址作为其值。你可以做:
item pophead(node **list)
{
head = *list;
// node *newlist = malloc(sizeof *newlist); // (no allocation needed)
node *newlist = NULL;
item result;
if(!*list)
{
perror("There is nothing to be pop\n");
return;
}
else
{
newlist = head->next;
result = head->data;
free(head);
*list = newlist;
}
return result;
}
(注意:无需为newlist
分配地址,您只需将地址从现有节点分配给指针,而不是将内容复制到新存储)
然后在调用函数中,而不是调用:
item someitem = pophead (list);
你会打电话的
item someitem = pophead (&list);
(注意:在C中,不需要强制转换malloc的返回值,这是不必要的。请参阅:)
不返回任何内容或
结构项
,具体取决于列表是否为空
从我们的广泛讨论中,从我从我们的谈话中收集的信息中,您所说的是项结果代码>如果列表为空,则不希望返回任何内容,否则希望返回result
您已经声明了返回typeitem
的函数,并且已经确认item
是typestruct
而不是指针的typedef
。类型控制可以返回的内容。当您将函数声明为返回类型item
——这就是它必须返回的内容。如果类型为item*
,则可以选择返回NULL
(和空指针)或指向已分配的块的指针,该块保存类型为item
如果列表为空,或者如果列表中有节点,则可以返回结构项
已初始化全部为零。您当前声明的位置:
item result; /* which leaves the values indeterminate */
您可以使用通用初始值设定项{0}
进行初始化,或者在C中,首选的初始化方法是使用命名初始值设定项,在该初始值设定项中,您可以将第一个成员的值设置为零(或在字符数组的情况下设置为空字符串),默认情况下,所有其他成员都将初始化为零,例如
item result = {0};
返回项
初始化为零或返回成员中填充值的项
是返回类型为项
的函数仅有的两个选项。您不能简单地返回
与使用void
返回类型一样,因此您可以更改函数类型或返回result
初始化所有零或使用值。除非返回newlist
您需要传递列表
的地址,例如项目pophead(节点**列表)
,这样您就可以对原始指针而不是副本进行操作。为什么?C是传递值,当您将变量作为参数传递时,函数将接收变量的副本。您在函数中所做的任何更改都将在返回时丢失
为了避免这种情况,您可以传递参数的地址,虽然函数仍将接收指针的副本,但它将包含原始地址作为其值。你可以做:
item pophead(node **list)
{
head = *list;
// node *newlist = malloc(sizeof *newlist); // (no allocation needed)
node *newlist = NULL;
item result;
if(!*list)
{
perror("There is nothing to be pop\n");
return;
}
else
{
newlist = head->next;
result = head->data;
free(head);
*list = newlist;
}
return result;
}
(注意:无需为newlist
分配地址,您只需将地址从现有节点分配给指针,而不是将内容复制到新存储)
然后在调用函数中,而不是调用:
item someitem = pophead (list);
你会打电话的
item someitem = pophead (&list);
(注意:在C中,不需要强制转换malloc的返回值,这是不必要的。请参阅:)
不返回任何内容或结构项
,具体取决于列表是否为空
从我们的广泛讨论中,从我从我们的谈话中收集的信息中,您所说的是项结果代码>如果列表为空,则不希望返回任何内容,否则希望返回result
您已经声明了返回typeitem
的函数,并且已经确认item
是typestruct
而不是指针的typedef
。类型控制可以返回的内容。当您将函数声明为返回类型item
——这就是它必须返回的内容。如果类型为item*
,则可以选择返回NULL
(和空指针)或指向已分配的块的指针,该块保存类型为item
如果列表为空,或者如果列表中有节点,则可以返回结构项
已初始化全部为零。您当前声明的位置:
item result; /* which leaves the values indeterminate */
您可以使用通用初始值设定项{0}
进行初始化,或者在C中,首选的初始化方法是使用命名初始值设定项,在该初始值设定项中,您可以将第一个成员的值设置为零(或在字符数组的情况下设置为空字符串),默认情况下,所有其他成员都将初始化为零,例如
item result = {0};
返回项
初始化为零或返回成员中填充值的项
是返回类型为项
的函数仅有的两个选项。您不能简单地返回代码>与使用v时一样