C语言中使用堆栈内存的递归

C语言中使用堆栈内存的递归,c,stack-memory,C,Stack Memory,我读过关于堆栈外观的文章。 我知道函数的参数将首先被推送,然后是返回地址,最后是函数的局部变量 是否可以使用堆栈生成递归函数 这就是我试图做的: void f() { int x = 2; printf("hey\n"); void (*p)() = (void (*)()) ((&x) - sizeof(x)); p(); } int func(int x) {return(func(x-1);} 这是使用堆栈的递归函数 除非您分配内存,否则所有内容都

我读过关于堆栈外观的文章。 我知道函数的参数将首先被推送,然后是返回地址,最后是函数的局部变量

是否可以使用堆栈生成递归函数

这就是我试图做的:

void f() {
    int x = 2;
    printf("hey\n");
    void (*p)() = (void (*)()) ((&x) - sizeof(x));
    p();
}
int func(int x)
{return(func(x-1);}
这是使用堆栈的递归函数

  • 除非您分配内存,否则所有内容都在堆栈上(或者可能在寄存器中)
  • 上面的函数不分配任何内存(肯定会导致堆栈溢出)

  • 您的第4行不仅仅是UB,它是非ENCE。您从指针中减去一些字节到X,然后认为可能有一个函数。它肯定会导致segfault

  • 不是以一种不包含未定义行为的方式。无论你想做什么…不要。称我为疯狂,但是如果我想从
    f()
    递归到
    f()
    ,我调用
    f()
    。这是一个疯狂的世界,对吗?你已经阅读了关于如何使用堆栈的示例。没有保证这是正确的(甚至接近的)它是如何在一些随机C编译器上工作的。所以,不。
    [教我]
    您对代码和数据在内存中的存储方式做出了许多错误的假设。请了解堆栈、堆、代码和数据段。仅仅因为代码和局部变量在C代码中混在一起,它们不会在较近的内存位置结束。是的,我知道我的程序将导致堆栈溢出,我不想重新设置通过再次调用函数来诅咒。我想以某种方式使用内存存储在堆栈中的方式,并通过访问不同的地址来再次调用函数。@I可能听起来你真正想要的只是一个循环。@dbush我们可以将其称为循环或递归,其实并不重要。我只想检查我对循环方式的理解e堆栈看起来像,我猜是出了什么问题。