使用C程序增加或减少堆栈?
答案 0 :(得分:8)
对,在C中,函数范围中的变量通常通过堆栈实现。但是这个模型不是由C标准强加的,编译器可以以任何方式实现它。标准中甚至没有提到“堆栈”这个词,如果它在或减少,甚至更少。你永远不应该尝试对此做出假设。
答案 1 :(得分:2)
malloc
以获取被调用者自动存储的内存,调用被调用者,并执行等效的{{1}它返回后。一个更复杂的版本会一次分配大量的“堆栈”,只在它即将耗尽时分配更多。
我会在具有虚拟内存的现代机器上调用那些非常糟糕的设计,但是在无MMU的微处理器上实现多进程操作系统时它们可能有意义,其中在每个进程中为堆栈保留一系列内存会浪费很多地址空间。
答案 2 :(得分:1)
怎么样:
int stack_direction(void *pointer_to_local)
{
int other_local;
return (&other_local > pointer_to_local) ? 1 : -1;
}
...
int local;
printf("direction: %i", stack_direction(&local);
因此,您要将调用堆栈上某个位置的变量地址与外部位置的变量地址进行比较。
答案 3 :(得分:0)
修改强>
阅读评论。似乎不可能使用我的方法确定堆栈方向。
结束编辑
在堆栈上声明一个数组变量,并比较连续元素的地址。
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
char buf[16];
printf("&buf[0]: %x\n&buf[1]: %x\n", &buf[0], &buf[1]);
return 0;
}
输出结果为:
misha@misha-K42Jr:~/Desktop/stackoverflow$ ./a.out
&buf[0]: d1149980
&buf[1]: d1149981
所以堆栈正在增长,正如预期的那样。
答案 4 :(得分:0)
如果您只想知道堆栈是否已更改,您可以将最后插入的对象保留到堆栈中,查看其顶部并比较两者。
答案 5 :(得分:0)
您还可以使用内联汇编监控ESP寄存器。 ESP寄存器保存未分配堆栈的地址。因此,如果某些东西被推到堆叠 - ESP减少,如果弹出 - ESP增加。 (还有其他命令可以修改堆栈,例如函数调用/返回)。
例如,当我们尝试计算递归函数(如Fibonacci Number(Visual Studio))时堆栈会发生什么:
#include <stdio.h>
int FibonacciNumber(int n) {
int stackpointer = 0;
__asm {
mov stackpointer, esp
}
printf("stack pointer: %i\n", stackpointer);
if (n < 2)
return n;
else
return FibonacciNumber(n-1) + FibonacciNumber(n-2);
}
int main () {
FibonacciNumber(10);
return 0;
}