【问题标题】:What does a non void C function without return statement actually return? [duplicate]没有 return 语句的非 void C 函数实际上返回什么? [复制]
【发布时间】:2020-08-03 16:24:44
【问题描述】:

让我们来看看这段代码:

node_t* create_tree_node(void* data){
    node_t* node = (node_t*) malloc(sizeof(node_t)); 
    node->data = data ; 
    node->left = NULL ; 
    node->right = NULL ; 
}

现在,如果你注意到了,没有 return 语句,假设我们忘了放一个。

我实际上尝试了类似的代码(想象node_t 是二叉树中节点的习惯结构,即数据的字段和指向下一个左右节点的指针),当我这样做时这个:

node_t* node = create_tree_node((void*) some_random_value) ; 

我能够创建一个具有所需值的节点,并将其保存在二叉树中,使用它并释放它。

那么两个问题:

  1. 没有任何 return 语句的非 void 函数实际上会返回什么? 它可能是堆栈上最后分配的变量吗?
  2. GCC 会为此引发警告,但不会引发错误。对于这种情况,编译器错误是否比编译器警告更相关?

【问题讨论】:

  • 使用未使用return 语句的函数返回的值返回调用未定义的行为
  • 这能回答你的问题吗? Implicit int return value of C function
  • 对于您的第二个问题,将-Werror 传递给您的编译器,您的所有警告都会变成错误!
  • @JoshuaYonathan 错了——这是另一回事。隐式返回类型和参数是一个过时的功能foo() {return 1;}
  • void 类型原本不是 C 的一部分;任何未显式声明返回特定类型的函数都被隐式类型化为返回int。由于编写 int 函数只是为了它们的副作用而执行(我怀疑很多人仍然会检查 printf 的返回值)是很常见的,因此该语言不需要要求来自非void 函数的显式return 语句。唯一的要求是,如果return 语句 出现在非void 函数中,那么它必须 后跟一些表达式。

标签: c


【解决方案1】:
  1. 没有任何 return 语句的非 void 函数实际上会返回什么?它可能是堆栈上最后分配的变量吗?

如果函数不执行return 并使用函数的返回值,C 标准没有定义行为。

(有证据表明,在某些情况下,GCC 故意返回函数中评估的最后一个完整表达式的值,但前段时间在 cmets 中讨论过,我没有参考。)

GCC 会为此发出警告,但不会引发错误。对于这种情况,编译器错误是否比编译器警告更相关?

C 标准不禁止具有非 void 返回类型的函数在不返回值的情况下返回(通过允许程序控制流向函数定义的终止 })。因此,符合标准的编译器应该在函数定义中允许这样做,这意味着它可以发出警告但不应该产生错误。允许调用这样的函数而不使用它的返回值;具有 C 标准定义的行为。

如果编译器可以看到函数调用使用了不返回值的函数的返回值,则编译器可能会为此产生错误。

具有非 void 返回类型的函数在某些情况下返回值而不在其他情况下有时很有用,例如接受命令执行并在“获取设置值”时返回值的函数”命令执行,并且在执行“Set value of setting”命令时不返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 2021-12-01
    • 2020-01-18
    • 2011-04-13
    • 2016-06-12
    相关资源
    最近更新 更多