IDA学习笔记
+ -

C语言函数临时变量内存布局

2025-04-11 2 0

使用的是VS2019编译
对于下面同一段代码:

#include <iostream>
#include <vector>
#include <algorithm>

struct AA
{
    const char* name;
    void* pt;

    AA(const char* n, void* p)
    {
        name = n;
        pt = p;
    }
};
std::vector<AA> vec;
size_t i;
void test() {
    int a;
    double b;
    char c;
    int d;
    int e;


    vec.push_back(AA("a", &a));
    vec.push_back(AA("b", &b));
    vec.push_back(AA("c", &c));
    vec.push_back(AA("d", &d));
    vec.push_back(AA("e", &e));

    std::sort(vec.begin(), vec.end(),
        [](AA& a, AA& b){
            return a.pt > b.pt;
            });
    for (i = 0; i < vec.size(); i++)
    {
        std::cout << vec[i].name << " ";
    }
    std::cout << std::endl;

    std::cout << "&a: " << &a << std::endl;
    std::cout << "&b: " << &b << std::endl;
    std::cout << "&c: " << (void*)&c << std::endl;
    std::cout << "&d: " << &d << std::endl;
    std::cout << "&e: " << &e << std::endl;
}

int main() {
    test();
    return 0;
}

分别对于不同的编译,其内存地址如下:

x86-debug

a b c d e
&a: 003CFB40
&b: 003CFB30
&c: 003CFB27
&d: 003CFB18
&e: 003CFB0C

x64-debug

e d c b a
&a: 0000007C3BDDF504
&b: 0000007C3BDDF528
&c: 0000007C3BDDF544
&d: 0000007C3BDDF564
&e: 0000007C3BDDF584

x86-release

b d a e c
&a: 00EFF928
&b: 00EFF930
&c: 00EFF923
&d: 00EFF92C
&e: 00EFF924

x64-release

b e d a c
&a: 000000CFBD4FF814
&b: 000000CFBD4FF820
&c: 000000CFBD4FF810
&d: 000000CFBD4FF818
&e: 000000CFBD4FF81C

可以看到,对于DEBUG情况下,内存布局是线性的。只是X86是递减的,X64是递增的
但是对于Release情况下,由于由于内对齐的原因,编译器会进行优化,而会现调整。

  • 优化将占用内存大的放在高端地址,如果内存大小相同,x86会有随机,x64则是先放后声名的。

0 篇笔记 写笔记

作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!