不清楚C中void函数的返回值

时间:2014-09-15 09:21:50

标签: c gcc

以下C程序有一个函数test(),尽管没有return语句,但返回:

  1. 格式为printf()
  2. 的字符数
  3. 如果单个字符以printf()
  4. 的格式存在,则为字符的ASCII值
  5. printf("")
  6. 的一个参数的值

    没有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");
    }
    

3 个答案:

答案 0 :(得分:1)

这种情况下的结果是基于返回test()时堆栈顶部的结果。行为未定义。

您应该在启用警告的情况下编译代码:

gcc main.c -Wall

另外,改变你的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页

值在寄存器中被抛出..这使得这种行为未定义。