分享
三行代码  ›  专栏  ›  技术社区  ›  User1234567

用正确的地址和数据为C创建一个堆栈图

  •  0
  • User1234567  · 技术社区  · 1 周前

    我试图绘制一个进程底部为0xffff的堆栈。程序很简单:

    int main() {
         char c;
         int i;
         double d;
         int iArr[4];
         return 0;
    }
    

    iArr[0]:0x7ffce0c79970

    iArr[3]:0x7ffce0c7997c

    d: 0x7ffce0c79980

    i: 0x7ffce0c79988

    c: 0x7ffce0c7998f

    函数的作用是:整数是4个字节,那么为什么要从88变为88e呢?另外,如果假定进程的底部是0xffff,那么c是从0xffff还是0xfffe开始?

    1 回复  |  直到 1 周前
        1
  •  0
  •   tadman    1 周前

    你需要考虑一下 对齐 alignof )以及 大小 sizeof )因为某些类型必须与特定的内存地址对齐,否则CPU无法处理。

    例如, int 地址必须是4字节的倍数, double char 只有一个字节可以去任何地方。

    如果您将堆栈可视化,您会看到它如下所示:

             |    |    |    |    |    |    |    |    |
             +----+----+----+----+----+----+----+----+
     ...9970 |      iArr[0]      |       iArr[1]     |
             +----+----+----+----+----+----+----+----+
     ...9978 |      iArr[2]      |       iArr[3]     |
             +----+----+----+----+----+----+----+----+
     ...9980 |                   d                   |
             +----+----+----+----+----+----+----+----+
     ...9988 |         i         |    |    |    | c  |
             +----+----+----+----+----+----+----+----+
    

    长大 ,即较早的条目具有更高的内存地址。所以 c 然后获取最高地址 i 获取下一个可能的最高地址,说明对齐方式等。这个 iArr 数组以尽可能高的对齐方式作为一个连续的内存块分配,但是索引的工作顺序与堆栈的顺序相反,它们总是累加,所以这看起来很奇怪,但也有意义。