【发布时间】:2020-09-26 00:15:45
【问题描述】:
以下函数在 Debian 上运行的 gcc 8.3 上成功编译并打印 hello 5:
#include <stdio.h>
int* bar(int* x) {}
int main() {
int x = 5;
int* p = bar(&x);
printf("hello %d\n", *p);
}
我对函数bar 感到困惑。它被声明为int*,但主体是空的,所以我实际上并没有告诉它返回任何东西。更令人担忧的是,为什么程序表现得好像我在 bar 的正文中说了 return x;?这种行为是在某处指定的还是只是一个意外?
【问题讨论】:
-
使用函数的返回值定义为返回某些东西但实际上并没有这样做是未定义的行为。 (如果实践不佳,只需调用函数并忽略任何返回值都是有效的。)
-
始终在启用额外详细警告的情况下构建(我推荐使用 GCC
-Wall -Wextra -Wpedantic)并将所有警告视为错误。 -
至于它返回你给它的原因,参数仍然保留在寄存器中。第一个参数的寄存器和最后一个参数的寄存器是一样的。
-
gcc 和
-Wall至少应该返回一个警告。
标签: c