c - 没有 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) ;
我能够创建一个具有所需值的节点,并将其保存在二叉树中,使用它并释放它。
所以两个问题:
- 没有任何 return 语句的非 void 函数实际上返回了什么?它可能是堆栈上最后分配的变量吗?
- GCC 会为此发出警告,但不是错误。对于这种情况,编译器错误实际上是否比编译器警告更相关?
解决方案
- 没有任何 return 语句的非 void 函数实际上返回了什么?它可能是堆栈上最后分配的变量吗?
return
如果函数不使用值执行并且使用函数的返回值,C 标准没有定义行为。
(有证据表明,在某些情况下,GCC 故意返回在函数中评估的最后一个完整表达式的值,但前段时间在评论中讨论过,我没有参考。)
GCC 对此提出警告,但不是错误。对于这种情况,编译器错误实际上不是更相关,而不是编译器警告吗?
C 标准不禁止具有非 void 返回类型的函数在不返回值的情况下返回(通过允许程序控制流向}
函数定义的终止)。因此,符合标准的编译器应该在函数定义中允许这样做,这意味着它可以发出警告但不应该产生错误。允许调用这样的函数而不使用它的返回值;具有由 C 标准定义的行为。
如果编译器可以看到函数调用使用了不返回值的函数的返回值,则编译器可能会为此产生错误。
具有非 void 返回类型的函数在某些情况下返回值而不在其他情况下有时很有用,例如接受执行命令并在“获取设置值”命令时返回值的函数执行“Set value of setting”命令时不返回值。
推荐阅读
- android - 我可以先使用 Phonegap,然后再使用 Cordova 吗?
- jenkins - 在 jenkins 的构建步骤中使用构建变量
- sql - 如何在 PostgreSQL 中查找多个子字符串的位置?
- java - 尝试使用原始套接字发送 GET 请求时出现 301
- python - kafka IllegalStateError:生产者被强制关闭
- sql - 如何选择从部分文本开始,以值范围SQL结束
- rust - 如何将大小特征插入到集合中
- excel - 如何使用excel函数用列标签填充单元格?
- javascript - 如何在 HTML5 中使矩形可拖动?
- angular - 读取 zip 文件内容并将其分配给局部变量