【问题标题】:Returning an empty item in a C function call在 C 函数调用中返回一个空项
【发布时间】:2021-01-22 20:47:39
【问题描述】:

我想返回堆栈中的最后一个。类似于以下内容:

Item* get_last_item()
{
    if (item_stack_size == 0) {
        // return <nothing> ?
    }  else {
         return ItemStack[item_stack_size-1];
    }
}

如果堆栈为空,则在返回 null 值的等价物时,建议的做法是什么?这通常会发出硬错误吗?类似于(Item*) 0 的值,或者建议的做法是什么?我的第一个想法是做这样的事情,但我不确定是否有更好的方法:

Item* get_last_item()
{
    return (item_stack_size != 0) ? ItemStack[item_stack_size-1] : (void*) 0;
}

【问题讨论】:

  • 一般来说,对于任何返回值或可能失败的函数,您有两种选择:(1)返回“带外”值,或(2)返回单独的成功/失败状态与返回值分开。两种方法都有其优点和缺点。对于指针,NULL 是您可以使用的出色带外值。对于字符,EOF。但是对于任意整数,通常没有一个值是不合法的。由于您的 get_last_item 函数返回指针,因此 NULL 可能是不错的选择——只要调用者总是仔细检查它!
  • @SteveSummit 我明白了,谢谢。您想更详细地说明这两种情况的答案吗?
  • 不,不只是现在,我应该在工作。 :-)
  • @SteveSummit 哈哈,好吧!自己返回NULL可以吗,还是一定要(Item*) NULL
  • @samuelbrody1249 在我的系统上(也可能在许多系统上)NULL 被定义为((void *)0)。并且截至cppreference:空指针常量可以转换为任何指针类型;这种转换会产生该类型的空指针值。

标签: c pointers null


【解决方案1】:

对于返回指针的函数,NULL 指针可以用作 带外 值(调用者当然应该在取消引用之前检查指针是否为 NULL):


Item *pop_last_item()
{
    if (!item_stack_size) {
        return NULL;
    }  else {
         return ItemStack[--item_stack_size];
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 2019-04-10
    • 2022-01-06
    • 2020-08-23
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多