免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12345下一页
最近访问板块 发新帖
查看: 4228 | 回复: 45
打印 上一主题 下一主题

请教一个有关虚拟内存的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-14 17:38 |只看该作者 |倒序浏览
在C中局部变量是在进程虚拟空间中的堆栈区分配的,取他的地址是不是就是他存在于堆栈中的虚存内存地址。那么如果在两次执行时堆栈不同是不是意味着两次局部变量的地址也不同呢? 我指的变量是在堆栈不同的地方分配的
下面时我写的一个程序
#include <stdio.h>;

void main(int argc, char **argv)
{
       
        int count = argc;
        while(count >; 0)
        {
                __asm
                {
                        push eax;
                        push eax;
                        push eax;
                }
        count--;
    }
        {
            int i = 1;    //在堆栈中分配i的空间
            printf("%d %d \n", &i, i);
                }
        count = argc;
        while(count >; 0)
        {
                __asm
                {
                        pop eax;
                        pop eax;
                        pop eax;
                }
            count--;
        }
}
这个程序根据输入参数数目的不同 向堆栈中压入数目不同的参数,然后再声明变量i,这样两次运行的堆栈情况不同。但实际结果却是对应两次不同个数的参数,i的地址相同。这是怎么回事呢?是不是我的理解有问题?(注 我用的是VC 6.0 操作系统是WIN2k)

论坛徽章:
0
2 [报告]
发表于 2004-12-15 08:44 |只看该作者

请教一个有关虚拟内存的问题

难道没人理解我说的意思吗?

论坛徽章:
0
3 [报告]
发表于 2004-12-15 08:55 |只看该作者

请教一个有关虚拟内存的问题

不太懂。但是你printf一个地址,怎么能用%d呢?要用%p或者0x%x

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-12-15 09:00 |只看该作者

请教一个有关虚拟内存的问题

临时变量是在堆栈上分配的吗?
{
int i = 1; //在堆栈中分配i的空间
printf("%d %d \n", &i, i);
count = argc;
while(count >; 0)
{
__asm
{
pop eax;
pop eax;
pop eax;
}
}
那这样pop出来数据不就会出错?

论坛徽章:
0
5 [报告]
发表于 2004-12-15 09:07 |只看该作者

请教一个有关虚拟内存的问题

什么是临时变量啊?偶知道那个auto变量是在栈上的,象楼主的程序,push之后又加了一个auto变量,如果编译器没给你做优化的话(没优化到寄存器里),然后pop到eax里边是不是首先弹出来的是i?然后弹出3次压入eax中的两个?

论坛徽章:
0
6 [报告]
发表于 2004-12-15 09:16 |只看该作者

请教一个有关虚拟内存的问题

楼上说的是 不过我是32位的机 所以数据指针也是32位的(另外%x只是打印出16进制的地址值) 这个我觉得没什么关系

至于局部变量 C专家编程中是这么讲的 他说用户栈主要有三个用途
1。 分配局部变量空间
2。 保存函数活动纪录
3。 某些表达式运算时使用到

pop eax 的问题 起码我的程序运行没出错 因为前面我还push了等量的eax

在VC中编译出来的代码 中局布变量是dword ptr[ebp+/- x]的访问形式,我的汇编大部分都忘了 难道是局部变量在栈中存储于一个特殊的位置?

论坛徽章:
0
7 [报告]
发表于 2004-12-15 09:28 |只看该作者

请教一个有关虚拟内存的问题

看样子大家 还没理解我写程序的意思
我来讲一下 我的想法是这样的 C中所有的局部变量(不包含static变量)存在于用户栈中(C专家编程))
因此我想如果在程序中间申请一个变量 而在申请变量之前 向栈中压入不同数目的eax(由输入参数个数决定) 这是否会影响申请的变量在栈中位置,那么该变量的地址(虚存地址)是否也不一样?
这就是我写这个代码的目的 pop那一段压栈逆操作没什么 但运行程序后发现i的地址不管参数个数的不同 并没有变化 我想了半天也没想通
请大家讨论讨论是什么原因

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2004-12-15 10:17 |只看该作者

请教一个有关虚拟内存的问题

仔细理解一下进程空间这个概念。应该会在这个问题上有所突破。

论坛徽章:
0
9 [报告]
发表于 2004-12-15 10:32 |只看该作者

请教一个有关虚拟内存的问题

调用一个函数:

返回地址压栈
调用参数压栈
局部变量压栈

然后才是执行你的那些push操作,i的虚拟地址当然不会变化了。总是。。。esp-4。。。

大家可以更正。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-12-15 10:37 |只看该作者

请教一个有关虚拟内存的问题

原帖由 "zjBahamout" 发表:
调用一个函数:

返回地址压栈
调用参数压栈
局部变量压栈

然后才是执行你的那些push操作,i的虚拟地址当然不会变化了。总是。。。esp-4。。。

大家可以更正。


嘿嘿,更正啦。先是调用参数压栈,然后才是返回地址,然后是局部变量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP