【发布时间】: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) ;
我能够创建一个具有所需值的节点,并将其保存在二叉树中,使用它并释放它。
那么两个问题:
- 没有任何 return 语句的非 void 函数实际上会返回什么? 它可能是堆栈上最后分配的变量吗?
- GCC 会为此引发警告,但不会引发错误。对于这种情况,编译器错误是否比编译器警告更相关?
【问题讨论】:
-
使用未使用
return语句的函数返回的值返回调用未定义的行为。 -
这能回答你的问题吗? Implicit int return value of C function
-
对于您的第二个问题,将
-Werror传递给您的编译器,您的所有警告都会变成错误! -
@JoshuaYonathan 错了——这是另一回事。隐式返回类型和参数是一个过时的功能
foo() {return 1;} -
void类型原本不是 C 的一部分;任何未显式声明返回特定类型的函数都被隐式类型化为返回int。由于编写int函数只是为了它们的副作用而执行(我怀疑很多人仍然会检查printf的返回值)是很常见的,因此该语言不需要要求来自非void函数的显式return语句。唯一的要求是,如果return语句 出现在非void函数中,那么它必须 后跟一些表达式。
标签: c