首页 > 解决方案 > 没有 return 语句的非 void C 函数实际上返回什么?

问题描述

我们来看这段代码:

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 会为此发出警告,但不是错误。对于这种情况,编译器错误实际上是否比编译器警告更相关?

标签: c

解决方案


  1. 没有任何 return 语句的非 void 函数实际上返回了什么?它可能是堆栈上最后分配的变量吗?

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

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

GCC 对此提出警告,但不是错误。对于这种情况,编译器错误实际上不是更相关,而不是编译器警告吗?

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

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

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


推荐阅读