如何在堆栈上为静态数组分配内存?

问题描述 投票:0回答:1

我开始深入研究漏洞利用、内存处理等,并遇到了同样的问题。到处都写着内存按照函数内声明的顺序分配给变量,但在我的例子中,它对此绝对没有影响,即任何选项中指向数组第一个元素的指针都保留在一个中地方。 这是一个例子:我有一个 C 代码

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void myFunction() {
    char x[20];
    int a =1;
    int b= 2;
    int c = 3;
    int d = 4;
    }
    int main(int argc, char *argv[]) {
    myFunction();
    }

我编译调试一下,输出数组x的地址的值:enter image description here 然后我编辑代码并在初始化 d 变量后声明数组:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 void myFunction() {
 int a =1;`your text`
 int b= 2;
 int c = 3;
 int d = 4;
    char x[20];
    }`your text`
    int main(int argc, char *argv[]) {
    myFunction();
    }

我的操作与之前的情况相同:enter image description here

正如你所看到的,数组在堆栈上的位置没有任何改变,你能向我解释一下为什么会发生这种情况吗?

c assembly gcc gdb stack-frame
1个回答
0
投票

如何在堆栈上为静态数组分配内存?

程序中定义的对象都不是静态的。它们都是自动的。静态对象不存储在堆栈中。

到处都写着内存按照变量在函数内声明的顺序分配给变量,…

这并不是到处都有写,而且一般情况下也不是这样。任何说这是错误的消息来源。

正如你所看到的,数组在堆栈上的位置没有任何改变,你能向我解释一下为什么会发生这种情况吗?

编译器通常根据对齐要求(以及其他因素)对对象进行分组,以减少它们所需的空间总量。在这种情况下,编译器首先放置了所有可能具有四字节对齐要求的

int
对象,并在其之后放置了具有一字节对齐要求的
char
数组。无论定义出现的顺序如何,位置的选择都保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.