首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • c 语言中一个指针错误 [已结贴,结贴人:rvnctu]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rvnctu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-24 13:20:52 楼主

    #include <stdio.h>

    int main()
    {
      int *p

      p = (int *)0x0012ff80;
      *p = 3;

      return 0;
    }

    这段代码在VC6.0中运行时,会出现内存(0x0012ff80是可读的)不能为写的错误,不知为什么,希望各位大侠帮忙看看。。。
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • qqwx_1986
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:22:351楼 得分:0
    p = (int *)0x0012ff80;
    p指向了一个常地址
    所以不能更改
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanfustudio
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      2

    发表于:2008-08-24 13:25:092楼 得分:0
    不能这样用,你知道那个地址指到哪里了。
    想用自己分配空间。

    int *p = (int *)malloc(sizeof(int));
    if(NULL !=p)
    {
        *p = 3;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • freedomyueye
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:27:373楼 得分:5
    C/C++ code
    int main() { int *p ; p = (int *)0x0012ff80; *p = 3; printf("%d \n",*p); return 0; }

    在 VS2005 ,好好的。
    输出:
    3
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhkefa
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:29:104楼 得分:5
    在VC6.0可以这样
    C/C++ code
    #include <iostream> using namespace std; int main() { /* int *p ; p = (int *)0x0012ff80; *p = 3; */ int *p; long addr = 0x0012ff80; p = reinterpret_cast<int *>(&addr); *p = 3; cout << *p << endl; return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • PenglueR
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:44:195楼 得分:5
    p指向的(int *)0x0012ff80这块内存是未知的,
    如果0x0012ff80的内存已经被分配,那你再把他的地址赋给p,
    当p一发生改变,那原来的内存数据将会遭到严重破坏,所以是不允许的,
    显然是会出现内存错误的!
    而且在VC++里,这种直接把内存分配的方式,是要求慎用的,搞不好会使系统崩溃!
    所以你还是不要用的好!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nwpulei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:47:026楼 得分:0
    有意思。
    可以随意修改内存的任意地方了。
    看来system要下班了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • PenglueR
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:48:557楼 得分:0
    补充:
    因为0x0012ff80这块内存是未知的,
    所以,当这块内存没分配时,它就会运行正常;
    当被分配了,那一运行就肯定出错!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • drq6772
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 13:55:388楼 得分:0
    有道理,学习了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhangjundriver
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 14:19:359楼 得分:0
    给我的感觉是你在编写汇编代码一样,哪有这样用的,很危险的
    除非你提早知道地址为该地址值的内存是没有被其他的使用,并在你使用期间也不会别别人使用
    那才安全的,再说还是不要那样干
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • phz1985
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 15:40:1910楼 得分:0
    你的地址值是怎么来的,能确保尚未被系统分配吗?
    若不能,就会出问题.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • suxpert
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-24 21:31:0111楼 得分:5
    建议lz不要这样使用,──这不是汇编,地址不是您自己决定的。

    一般情况下,对一个随机的地址空间赋值,将会引发“异常访问”(非法访问)。

    在Windows NT下,操作系统会捕获异常,一般情况就是“内存区为只读,无法写入”之类的错误,之后windows会强制将程序结束。

    我不知道您的0x0012ff80是从哪里得到的地址,即使是前面定义的变量地址或者malloc的地址,

    这种访问也是不好的,确切说应该是“不被支持的”,

    注意, 好的风格是程序中尽量不出现常量数字,

    并且一定没有常数地址!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenlin0604
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 03:56:4712楼 得分:0
    好啊说得很好啊!
    那我想问一下,汇编中内存是怎么由程序员定义的呢我一直弄不明白啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhaozx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 07:32:2613楼 得分:0
    1、
        P指向的常地址,最好不要改变
    2、
        0x0012ff80这块地址从那得来,是否被系统占用
    3、
        想改变p地址,就要自己申请P的地址int*p = (int*)malloc(sizeof(int))
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbh2001
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 08:43:1314楼 得分:0
    int *p
    p = (int *)0x0012ff80; //------>危险的用法,你怎么知道该地址被谁占用, 这也是指针不同于整数的原因
    p=3; //易引起崩溃
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wind_breez
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 08:47:4815楼 得分:0
    这种代码也敢写,厉害!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ufooler
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 09:08:2216楼 得分:0
    学习学习嘛。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • malu_1982
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 12:40:4817楼 得分:0
    LZ这样做很危险,也没什么意思。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • bgcelite
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 12:52:1418楼 得分:0
    内存的使用只有系统知道,你最好不要随意给指针直接赋值,否则会出现一系列的问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xianyuxiaoqiang
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 13:14:1519楼 得分:0
    内存分配必须交给系统去做。
    p = (int *)0x0012ff80; //直接把该地址内存单元拿来用
    这样做之前首先要确保该内存单元未被其它进程占用。
    除非你已经知道这个地址是可用的,否则不要这样做。
    如果编译器允许你运行该程序,可能你的系统就要奔溃了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • rvnctu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-25 16:26:1120楼 得分:0
    谢谢各位了...

    最近我在做DSP,在DSP上是可以直接这样用的,所有就想测试一下在pc机上能不能这样使用...

    我先申请了一个变量,知道了系统分配给它的地址,即0x0012ff80,然后将那个变量删掉,进行了上述实验,结果出错,
    刚才我在VS2005中试过了,结果是正确的。

    所以我的结论是:如果某个内存单元没有被分配,理论上应该是这样用的。但是,这样做是很危险的,确实很容易引起系统崩溃,所以我也只是测试测试,在实际程序设计中,应该尽量避免这样使用。。。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved