如果没有return语句,这个C int函数如何工作?

Zag*_*rax 1 c recursion return

我有这个C代码,我确信它不会起作用,但确实如此.

#include <stdio.h>

int* find (int* a, int val) {
    if (*a == val)
        return a;
    else
        find(a+1, val);
}

int main() {
    int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *b;

    b = find(a, 7);

    printf("%d\n", *b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,我从gcc收到警告,因为它在find函数的else分支中缺少return语句.但是,它完美地运作.

为什么会这样?如何通过递归函数返回int?当然,最后一次调用返回一个int,但我在void上下文中调用它.

MBy*_*ByD 7

此代码不是有效的C代码,并且未定义此类代码的行为.

它工作的一个原因可能是在最后一次调用之后没有操作,find其中可能导致递归调用的返回值保留在返回寄存器(可能是eax)中.

但同样 - 行为未定义.