【问题标题】:function cannot return null in c函数不能在c中返回null
【发布时间】:2017-01-31 22:28:17
【问题描述】:

我的代码应该将 StackNode 项推入 Stack。但是,当堆栈已满时,我试图让函数不再推送,并返回 null,但它不会返回 null!

Stack push(Stack stk,int data)
{
  struct StackNode *top = stk.top;
  struct StackNode *node = malloc(sizeof(struct StackNode));
  if(node == NULL)
  {
    printf("Stack is full\n");
    return NULL;
  }

  node->data = data;
  node->nextNode = top;
  stk.top = node;
  stk.count++;
  return stk;
}

这是我得到的错误: error: returning 'void *' from a function with incompatible result type 'Stack' (aka 'struct Stack') return NULL;

我不确定这意味着什么。我如何解决它? Stack 的 NULL 等价物是什么?

【问题讨论】:

  • 错误信息中有什么不清楚的地方? NULLStack 类型的值吗?
  • 我不知道堆栈的 null 等效项是什么
  • 没有等价物。
  • 您的功能和方法必须重新设计。例如返回bool,表示成功/失败。
  • @ashadeka:这由你决定。你为什么还要尝试按值传递和返回你的堆栈?这根本没有意义。您需要彻底重新设计您的传球(和返回)方法。

标签: c null stack


【解决方案1】:

也许您应该重新考虑一些基本的事情: 首先,只有指针可以是NULL,而不是对象。因此,如果你返回一个struct Stack 类型的对象(它不是一个指针),你就不能返回NULL,而只是一个struct Stack 的实例。

其次,通过值传入并返回struct Stack的对象会导致复制各自的对象;我认为传递引用或指针会是更好的选择;并且 - 如果您传入并返回一个指针,您还可以返回 NULL 以指示一个完整的堆栈或其他一些问题。

【讨论】:

    【解决方案2】:

    问题是你的函数必须返回一个类型为Stack的值。

    您提供的代码没有定义NULL 的类型,但是,由于您没有看到另一个错误并且您将其分配给node,我猜NULL 的类型是StackNode *... 或者至少是与之兼容的东西。

    所以,这就是你的问题。当您的函数声称返回 Stack 时,您正试图返回类型为 StackNode * 的内容。

    最好的办法是重新设计这个函数,它返回push 操作的结果,而不是Stack 本身。

    【讨论】:

    • "您提供的代码没有定义 NULL 的类型,但是,由于您没有看到另一个错误并且您将其分配给节点,我猜想该类型NULL 是 StackNode *... 或者至少是与之兼容的东西。” NULL 由实现提供,当然不会是 StackNode*。通常是0(void*)0。它是 C 和 C++ 的一部分。
    • 很可能,是的...但是NULL 仅在您包含定义它的标头时才定义为(void *)0
    • OP 的完整代码包含该标头的可能性要高几个数量级,而不是 OP 试图创建自己的 NULL 并且未能实际编写所述定义甚至提及它我们。
    猜你喜欢
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多