关于内存问题

睡在床板下_ 2008-10-28 12:17:48
windows提供4G的虚拟空间给一个进程使用, 其中默认有2G是用户使用的,那么我应该可以在2G空间里进行任何操作,但如下为何会出错呢?

int main
{
int *p = NULL;
p = (int *)0x68888888 ; (这个地址空间在2G范围内)
*p = 2;

}
这样执行时 程序会出错,我有点不太明白。
...全文
107 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
killbug2004 2008-10-28
  • 打赏
  • 举报
回复
内存有属性的,可读,可写,可运行等等,用之前要申请
xmczr 2008-10-28
  • 打赏
  • 举报
回复
LZ有点猛,别人的东西也想敢改,呵呵
lbh2001 2008-10-28
  • 打赏
  • 举报
回复
在用户模式下,我们使用内存是要经过操作系统将虚拟地址映射到实际内存的地址上的
用户是不能直接使用显式的地址的
但在嵌入式编程下可以使用
太乙 2008-10-28
  • 打赏
  • 举报
回复
在用户操作内存后,都会有一句:

00401881 call __chkesp (00422d20)

来check用户是否非法访问未申请的内存!

如果lz说的成立,那么
int a[10];
cout<<*(a+11);这也应该能好使!
帅得不敢出门 2008-10-28
  • 打赏
  • 举报
回复
你的意思是只要是在2G空间之内的东西都可以随意修改

如果程序中出现越界访问,修改了栈中函数的返回地址为0都会出现异常都有可能出现异常

更何况你这么大范围的空间都要骚扰.
phz1985 2008-10-28
  • 打赏
  • 举报
回复
即使是用户空间就可以随便写了??
再说你怎么肯定它就是用户空间呢?
xhs_lh04 2008-10-28
  • 打赏
  • 举报
回复
2G进程空间还分数据区,代码区,堆栈区,堆栈区是函数分配变量操作用的,
另外你地址变有一套映射过程,反正是在程序里不要直接指定内存地址,要用相对地址
机智的呆呆 2008-10-28
  • 打赏
  • 举报
回复
有一部分,内存是欲留给系统使用的~~~~这部分内存对于用户来说是不可以访问的
hjzwl1018 2008-10-28
  • 打赏
  • 举报
回复
虚拟空间使得内存需要交换使用,你内存有那么大吗?p = (int *)0x68888888;这个操作直接使p指到内存地址为0x68888888大的地方,肯定报错。
kiffa 2008-10-28
  • 打赏
  • 举报
回复
因为win分配内存空间不一定从地址0开始,不一定把0 - 2G的地址空间作为用户空间,它可能是把0x40000000 - 0x40000000+2G 来作为用户空间,或者其他类似的分配方案,比如把 2G - 4G 作为用户空间,我不是搞win的,不清楚具体的策略。

这样你分配的0x68888888有可能位于系统内核空间,对此进行访问当然会出错。

另外,即使是用户空间,也有一部分是设置了只读属性的,如果你的0x68888888刚好位于这部分,*p = 2 这条语句试图去写一个只读区域,自然也会出错。
xxgamexx 2008-10-28
  • 打赏
  • 举报
回复

int a;
cout<<(int*)&a+9999999;


这应该也差不多了吧~



xtting_8984313 2008-10-28
  • 打赏
  • 举报
回复
多看点操作系统把,最少也应该知道系统有内存管理一说吧:那就应当明白内存不是程序员(尤其是高级程序)能任意支配的。
c里面如果想操作一个内存必须有相应的声明,然后系统给你返回可以使用的内存地址,然后才可以使用。你这样肆无忌惮的玩,是不允许的。
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Demon__Hunter 的回复:]
有一部分,内存是欲留给系统使用的~~~~这部分内存对于用户来说是不可以访问的
[/Quote]
严重同意……

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧