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