我开始深入研究漏洞利用、内存处理等,并遇到了同样的问题。到处都写着内存按照函数内声明的顺序分配给变量,但在我的例子中,它对此绝对没有影响,即任何选项中指向数组第一个元素的指针都保留在一个中地方。 这是一个例子:我有一个 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的地址的值: 然后我编辑代码并在初始化 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();
}
正如你所看到的,数组在堆栈上的位置没有任何改变,你能向我解释一下为什么会发生这种情况吗?
如何在堆栈上为静态数组分配内存?
程序中定义的对象都不是静态的。它们都是自动的。静态对象不存储在堆栈中。
到处都写着内存按照变量在函数内声明的顺序分配给变量,…
这并不是到处都有写,而且一般情况下也不是这样。任何说这是错误的消息来源。
正如你所看到的,数组在堆栈上的位置没有任何改变,你能向我解释一下为什么会发生这种情况吗?
编译器通常根据对齐要求(以及其他因素)对对象进行分组,以减少它们所需的空间总量。在这种情况下,编译器首先放置了所有可能具有四字节对齐要求的
int
对象,并在其之后放置了具有一字节对齐要求的 char
数组。无论定义出现的顺序如何,位置的选择都保持不变。