鱼C论坛

 找回密码
 立即注册
查看: 1972|回复: 15

栈中的地址

[复制链接]
发表于 2020-7-29 16:44:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-29 19:43:36 | 显示全部楼层
vs2019 x86 下,地址由高到低
应该是编译器的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 20:18:17 | 显示全部楼层
livcui 发表于 2020-7-29 19:43
vs2019 x86 下,地址由高到低
应该是编译器的问题

vs 默认的是32位,我在32位下试了确实是由高到低。
64位下是由低到高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 20:42:00 | 显示全部楼层
Unicorn# 发表于 2020-7-29 20:18
vs 默认的是32位,我在32位下试了确实是由高到低。
64位下是由低到高

调回默认
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 23:39:37 From FishC Mobile | 显示全部楼层
livcui 发表于 2020-7-29 20:42
调回默认

32位下 指针都是四个字节的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 08:53:20 | 显示全部楼层
Unicorn# 发表于 2020-7-29 23:39
32位下 指针都是四个字节的



现在应该没什么教程用 x64 教吧(至少我不用)

指针是四个字节会有什么限制吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 10:45:54 From FishC Mobile | 显示全部楼层
livcui 发表于 2020-7-30 08:53

现在应该没什么教程用 x64 教吧(至少我不用)


之前用dev的时候默认的是x64
所以是win32更通用还是x64呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 10:47:48 | 显示全部楼层
Unicorn# 发表于 2020-7-30 10:45
之前用dev的时候默认的是x64
所以是win32更通用还是x64呢

我是萌新别说我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 10:55:24 | 显示全部楼层
000000000022FE4C, 000000000022FE4B, 000000000022FE40

--------------------------------
Process exited after 0.007967 seconds with return value 0
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-30 18:01:08 | 显示全部楼层
定义变量不是入栈。只有调用函数时才入栈。栈和代码的区域不同,是因为代码一写,就全部挤在一起。自己定义的变量,代码中留出位置。但函数参数这么多,都留位置的话,将会造成代码区太大。那些没用的东西,白白浪费。造成大量空白区域,加载是要时间的。EXE文件太大了,用户等不起。栈区就不一样,用到函数时,函数参数传过去,直接进栈区。不用时,栈指针回去。代码区还是不变,这么多。有利于提升速度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 20:22:02 | 显示全部楼层
405794672 发表于 2020-7-30 18:01
定义变量不是入栈。只有调用函数时才入栈。栈和代码的区域不同,是因为代码一写,就全部挤在一起。自己定义 ...

代码在代码段,局部变量在栈里,不会相互影响呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 10:38: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可以看到各种变量的地址,每一步,相应的出现各种变化。比如赋值,你可以看到哪一步后,变量值的变化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 15:52:39 From FishC Mobile | 显示全部楼层
405794672 发表于 2020-7-31 10:38
我都搞糊涂了。。。这么写吧!
看看到底是怎么回事。


我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 17:23:59 | 显示全部楼层
Unicorn# 发表于 2020-7-31 15:52
我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大

啥呀?栈的生长方向不能变吧?这不是32位64位问题,这是CPU的问题。栈指针是CPU自动变化的。由高到低。同一个CPU你128位都不能改变它。不然不乱套了?CPU要做的事那么多,一秒钟不知道要变多少次栈。栈空间要是乱套,系统就不正常了。啥事都做不好了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 17:29:50 | 显示全部楼层
Unicorn# 发表于 2020-7-31 15:52
我知道是32位下是由高地址到低地址了
地址之间的间隔为什么那么大

你要查栈的方向,你可以用debug调试,也可以逆向,调试,你可以看到CPU的栈指针寄存器。
sp是栈指针寄存器,推入一个数据,它会自动减相应字节。而BP是保存SP的一个寄存器。主要是当函数调用时,
BP首先保存SP的值,再把SP移位,有多少参数,移多长的字节。用来临时放参数。用完了后,函数返回时,SP
会从BP里再填回来。恢复之前的栈指针,于是,相当于函数里的参数和局部变量一起被释放了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 18:45:26 From FishC Mobile | 显示全部楼层
405794672 发表于 2020-7-31 17:29
你要查栈的方向,你可以用debug调试,也可以逆向,调试,你可以看到CPU的栈指针寄存器。
sp是栈指针寄存 ...

???这不是我问的
两个整型地址的间隔为什么不是4
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表