栈中的地址
本帖最后由 Unicorn# 于 2020-7-29 16:47 编辑#include <stdio.h>
int main(void)
{
int i = 0;
char j = 0;
int* k = NULL;
printf("%p, %p, %p\n", &i, &j, &k);
return 0;
}
①栈中不应该是高地址到低地址吗???
②i -> j 16个字节,j -> k 20个字节,为什么???
我用的是vs ,解决方案平台是x64 vs2019 x86 下,地址由高到低
应该是编译器的问题 livcui 发表于 2020-7-29 19:43
vs2019 x86 下,地址由高到低
应该是编译器的问题
vs 默认的是32位,我在32位下试了确实是由高到低。
64位下是由低到高 Unicorn# 发表于 2020-7-29 20:18
vs 默认的是32位,我在32位下试了确实是由高到低。
64位下是由低到高
调回默认{:10_245:} livcui 发表于 2020-7-29 20:42
调回默认
32位下 指针都是四个字节的 Unicorn# 发表于 2020-7-29 23:39
32位下 指针都是四个字节的
额
现在应该没什么教程用 x64 教吧(至少我不用)
指针是四个字节会有什么限制吗?{:10_245:} livcui 发表于 2020-7-30 08:53
额
现在应该没什么教程用 x64 教吧(至少我不用)
之前用dev的时候默认的是x64
所以是win32更通用还是x64呢 Unicorn# 发表于 2020-7-30 10:45
之前用dev的时候默认的是x64
所以是win32更通用还是x64呢
我是萌新别说我{:10_284:} 000000000022FE4C, 000000000022FE4B, 000000000022FE40
--------------------------------
Process exited after 0.007967 seconds with return value 0
请按任意键继续. . .
定义变量不是入栈。只有调用函数时才入栈。栈和代码的区域不同,是因为代码一写,就全部挤在一起。自己定义的变量,代码中留出位置。但函数参数这么多,都留位置的话,将会造成代码区太大。那些没用的东西,白白浪费。造成大量空白区域,加载是要时间的。EXE文件太大了,用户等不起。栈区就不一样,用到函数时,函数参数传过去,直接进栈区。不用时,栈指针回去。代码区还是不变,这么多。有利于提升速度 405794672 发表于 2020-7-30 18:01
定义变量不是入栈。只有调用函数时才入栈。栈和代码的区域不同,是因为代码一写,就全部挤在一起。自己定义 ...
代码在代码段,局部变量在栈里,不会相互影响呀 本帖最后由 405794672 于 2020-7-31 10:55 编辑
Unicorn# 发表于 2020-7-30 20:22
代码在代码段,局部变量在栈里,不会相互影响呀
我都搞糊涂了。。。这么写吧!
看看到底是怎么回事。
void a(int m,int n)
{
int c,d;
printf("局部变量c的地址:%p\n",&c);
printf("局部变量d的地址:%p\n",&d);
print("int的尺寸:%d\n",sizeof(int));
printf("参数m的地址: %p\n",&m);
printf("参数n的地址: %p\n",&n);
}
void main()
{
int i=0, j=0;
printf("局部变量i的地址:%p\n",&i);
printf("局部变量j的地址:%p\n",&j);
printf("函数a的地址:%p\n",a);
a(i,j);
}
这个也难发现。始终是四个字节一起的。入栈顺序是从右边往左的。也就是说先是N入栈,再是M入栈。M地址比N要小。
如果是汇编就好办了。还有,可以调试,在VS可以看到各种变量的地址,每一步,相应的出现各种变化。比如赋值,你可以看到哪一步后,变量值的变化 405794672 发表于 2020-7-31 10:38
我都搞糊涂了。。。这么写吧!
看看到底是怎么回事。
我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大 Unicorn# 发表于 2020-7-31 15:52
我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大
啥呀?栈的生长方向不能变吧?这不是32位64位问题,这是CPU的问题。栈指针是CPU自动变化的。由高到低。同一个CPU你128位都不能改变它。不然不乱套了?CPU要做的事那么多,一秒钟不知道要变多少次栈。栈空间要是乱套,系统就不正常了。啥事都做不好了。 Unicorn# 发表于 2020-7-31 15:52
我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大
你要查栈的方向,你可以用debug调试,也可以逆向,调试,你可以看到CPU的栈指针寄存器。
sp是栈指针寄存器,推入一个数据,它会自动减相应字节。而BP是保存SP的一个寄存器。主要是当函数调用时,
BP首先保存SP的值,再把SP移位,有多少参数,移多长的字节。用来临时放参数。用完了后,函数返回时,SP
会从BP里再填回来。恢复之前的栈指针,于是,相当于函数里的参数和局部变量一起被释放了。 405794672 发表于 2020-7-31 17:29
你要查栈的方向,你可以用debug调试,也可以逆向,调试,你可以看到CPU的栈指针寄存器。
sp是栈指针寄存 ...
???这不是我问的
两个整型地址的间隔为什么不是4
页:
[1]