以下C程序有一个函数test()
,尽管没有return语句,但返回:
printf()
printf()
printf("")
。没有return
语句的函数如何返回值以及结果的可变性为何?
#include <stdio.h>
#include <stdlib.h>
int test(int, int);
int main(int argc, char **argv)
{
printf("\n%d\n", argc);
if (argc > 1)
{
printf("\n%d\n", test(atoi(*++argv), 2));
printf("\n%d\n", test(2, atoi(*argv)));
}
return 0;
}
int test(int a, int b)
{
printf("0");
}
答案 0 :(得分:1)
这种情况下的结果是基于返回test()时堆栈顶部的结果。行为未定义。
您应该在启用警告的情况下编译代码:
另外,改变你的argv指针有点脏。取消引用argv会以明确的方式直接传达您的意图:
printf("\n%d\n", test(atoi(*++argv), 2));
printf("\n%d\n", test(2, atoi(*argv)));
应该是:
printf("\n%d\n", test( atoi(argv[1]), 2) );
printf("\n%d\n", test( 2, atoi(argv[1]) ) );
答案 1 :(得分:0)
从函数返回值的方式在不同的体系结构中是不同的。在大多数情况下,它是某些CPU寄存器的值。如果您没有专门使用return
,那么该寄存器的内容就是编译器“看到”函数的返回值。有时,它是被调用的最后一个函数的返回值,但有时它可能是其他的东西。行为未定义。
答案 2 :(得分:0)
你应该看看this slideshare第22页
值在寄存器中被抛出..这使得这种行为未定义。