Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在没有警告的情况下返回正确的数据类型_C_Linked List_Return - Fatal编程技术网

C 如何在没有警告的情况下返回正确的数据类型

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")

我正在尝试构建自己的链表数据结构,但有一件事让我遇到了麻烦:我不知道如何返回一个结构数据类型,该结构数据类型在指针中的值为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");
        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

您已经声明了返回type
item
的函数,并且已经确认
item
是type
struct
而不是指针的
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

您已经声明了返回type
item
的函数,并且已经确认
item
是type
struct
而不是指针的
typedef
。类型控制可以返回的内容。当您将函数声明为返回类型
item
——这就是它必须返回的内容。如果类型为
item*
,则可以选择返回
NULL
(和空指针)或指向已分配的块的指针,该块保存类型为
item

如果列表为空,或者如果列表中有节点,则可以返回结构
已初始化全部为零。您当前声明的位置:

    item result;    /* which leaves the values indeterminate */
您可以使用通用初始值设定项
{0}
进行初始化,或者在C中,首选的初始化方法是使用命名初始值设定项,在该初始值设定项中,您可以将第一个成员的值设置为零(或在字符数组的情况下设置为空字符串),默认情况下,所有其他成员都将初始化为零,例如

    item result = {0};
返回
初始化为零或返回成员中填充值的
是返回类型为
的函数仅有的两个选项。您不能简单地
返回与使用
v时一样