我知道在我个人熟悉的架构(x86,6502等)中,堆栈通常会向下增长(即,每个推入堆栈的项目都会导致SP递减,而不是递增的SP).
我想知道这个的历史原因.我知道在一个统一的地址空间中,在数据段的另一端(例如)开始堆栈很方便,所以如果双方在中间发生碰撞,那么只会出现问题.但是为什么堆栈传统上是最重要的?特别是考虑到这与"概念"模型的对立面如何?
(请注意,在6502架构中,堆栈也向下增长,即使它被限制在一个256字节的页面上,这个方向选择似乎是任意的.)
我在c中有这段代码:
int q = 10;
int s = 5;
int a[3];
printf("Address of a: %d\n",    (int)a);
printf("Address of a[1]: %d\n", (int)&a[1]);
printf("Address of a[2]: %d\n", (int)&a[2]);
printf("Address of q: %d\n",    (int)&q);
printf("Address of s: %d\n",    (int)&s);
输出是:
Address of a: 2293584
Address of a[1]: 2293588
Address of a[2]: 2293592
Address of q: 2293612
Address of s: 2293608
所以,我看到,从那里a开始a[2],内存地址每个增加4个字节.但是,从q到s,内存地址减少了4个字节.
我想知道两件事:
a[2]和q内存地址之间发生了什么?为什么那里存在很大的记忆差异?(20个字节).注意:这不是作业问题.我很好奇堆栈是如何工作的.谢谢你的帮助.
人们谈论堆栈和堆是什么以及它们之间的差异.但我很想知道如果一个CPU不支持堆栈和堆结构,那么C可以在没有堆栈和堆的情况下正常运行吗?
我读到了检测堆栈增长检测问题的不同响应,我理解,在现代架构中,堆栈可能会随机增长,可能会在堆外创建,依此类推.
但是,在这个经典的访谈问题中,我想了解为什么人们使用函数调用而不是在同一函数中比较2个局部变量.我认为必须有一些特殊的理由这样做,但不是一个C /低级开发人员[Java :)],我只是在猜测.
这是我试过的代码:
void sub (int *a)  {
    int b;
    int c;
    printf ("a:%d\n", a);
    printf ("b:%d\n", &b);
    printf ("c:%d\n", &c);
    if (&b > a) {
        printf ("Stack grows up.\n");
    } else {
        printf ("Stack grows down.\n");
    }
}
int main (void) {
    int a;
    int b;
    sub (&a);
    printf ("\nHere we go again!!\n");
    if (&b > &a)  {
        printf ("Stack grows up.\n");
    } else  {
        printf ("Stack grows down.\n");
    }
    return 0;
}
我还发现这篇文章试图优化我不理解的解决方案:http …
在学习C++(和C)时,我对堆栈分配的工作有一些特别的疑问,我无法找到解决方案:
堆栈分配是否隐式调用malloc/free函数?如果不; 它如何确保堆栈分配和堆分配之间没有冲突?
如是; C++中的堆栈分配是否也隐式调用new/delete?如是; 重载一个类的new运算符会影响它的堆栈分配吗?
它在VC++中产生了令人困惑的结果; 但由于VC++并不完全符合标准(或者我听说过),我决定在这里问一下......
处理器的字节序与堆栈增长方向之间是否存在关系?
例如,x86 架构是小端的,堆栈向下增长(即它从最高地址开始,并随着每个push操作向低地址增长)。类似地,在大端的SPARC 体系结构中,堆栈从最低地址开始并向上增长到更高的地址。
这种关系模式几乎可以在所有架构中看到。我相信这个未说明的约定一定是有原因的。这可以从计算机架构或操作系统的角度解释吗?这是为了对处理器内部的微码进行一些优化吗?这是否以某种方式帮助内核?或者可能是其他原因?
提前致谢!
这里有一个问题涉及堆栈增长方向.Michael Burr在ARM处理器中回复说过,可以配置堆栈增长方向 - 即下降(正常行为)堆栈在内存中向零地址(低地址)增长或向上增长,即堆栈向内存中的更高地址增长.
我的问题是:在ARM处理器中,如何让堆栈在向上的方向上增长?
如何将堆栈配置为升序,默认情况下是降序?任何寄存器位设置/复位等
据我所知,堆栈假设向下增长.
我试着运行这段代码:
#include<stdio.h>
void func(char* a1, int a2, int a3) {
    char b1[10];
    int b2;
    int b3;
    printf("a3 address is: %p\n", &a3);
    printf("a2 address is: %p\n", &a2);
    printf("a1 address is: %p\n", &a1);
    printf("-----------------------\n");
    printf("b1 address is: %p\n", &b1);
    printf("b2 address is: %p\n", &b2);
    printf("b3 address is: %p\n", &b3);
}
int main() {
    func("string",2,3);
    return 0;
}
结果不像我预期的那样:
a3 address is: 0x7fff68473190
a2 address is: 0x7fff68473194
a1 address is: 0x7fff68473198
-----------------------
b1 address is: 0x7fff684731b0
b2 address is: 0x7fff684731a8
b3 address …如何在C中找到堆栈正向或反向进展?这项工作?
int j = 0;
int k = 0;
if (&k > &j) 
 printf ("Stack is growing in forward direction");
else if (&k < &j) 
  printf ("Stack is growing in reverse direction");
我只想更好地了解堆栈在地址空间中的含义(即您有代码/文本,堆,数据和堆栈)
基本上我的理解是堆栈包含局部变量,但是数据包含什么和堆栈包含什么之间的区别是什么?是不是数据变量?
如果程序对函数的递归调用a()是否意味着对于每个递归级别都有一个新的堆栈?
如果您要构建一个用于运行任意程序的处理器,那么您可以使用的最小指令集(ISA)是什么?
我刚在想:
ALU-ops(add,sub,mul,div)
加载reg,[地址]
商店注册,[地址]
分支 - 如果操作.可能有分支,如果不相等,如果>,如果<(branchif reg1,reg2,LABEL)
你怎么看?
我正在编程一些具有 64 MB SDRAM 的嵌入式设备。(C 用作编程语言)。是否可以猜测(甚至是粗略的猜测)该设备堆栈的可能大小?指的是在我们进行分配时使用的内存,例如,
char s[100];
int t[50];
等等。
例如,它会超过50KB吗?等等,这就是我对粗糙的意思
加上当我在某个函数 f 中有变量时
f()
{
  int p;
}
当 f() 存在时,这个变量会消失吗?
所以当我调用 f2() 时:
void f2()
{
  char t[100];
}
只有 100 个元素的字符数组的大小才会添加到堆栈大小中,对吗?int p不再考虑先前函数的大小。