首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 指针函数能修改函数的内容吗?? [已结帖,结帖人:liaoyonghan]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liaoyonghan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-04-21 10:53:56 楼主
    一个指向变量的指针,能通过这个指针改变变量的值.如:
    int a=10;
    int *pA=&a;
    *pA=100;//此时a的值变为100了

    现在我想问的是,一个指向函数的指针函数,我们可以通过这个指针函数修改那个函数的内容吗??我觉得指针函数不光只是拿来调用这么简单吧!!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fetag
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 10:55:411楼 得分:0
    不能!函数指针只是用来调用函数的,别想用它做别的事了...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • sheenl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 10:58:052楼 得分:0
    可以, 但是你会改吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Maxwell
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:02:273楼 得分:0
    想改总是能改的,但是c本身不支持这个功能,如果没有特殊需要,还是不要研究这个问题的好。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wencn911
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:09:214楼 得分:0
    在实际编程中,函数指针的功能不是只用来简单的调用函数,这点楼主已经意识到了

    函数指针的普遍一个用途是:通过调用一个函数指针,根据实际情况来调用不同的函数实现.

    这里还要涉及到用C语言实现面向对象的继承与多态的用法
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hai040
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:15:535楼 得分:0
    还是不能吧,要改也要强制转换成其它类型的指针
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ForestDB
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:24:216楼 得分:0
    函数指针(函数的入口地址)就是拿来做调用的,你当然可以用它做其它的事,但请确定你在做什么或者确定承担相应的后果.

    其实C,就是这样,它可以做它该做的事,也可以做它不该做的事,当用它做它不该做的事的时候,要么确定你在做什么,要么你要承担相应的后果.
    这样的例子很多,比如float a = 1.0; printf("%d\n", a);
    再比如数组的越界不做检查,你可以写出溢出攻击.
    C的哲学就是简单,C认为程序员应该勇敢的承担责任.^^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k5624
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:34:017楼 得分:0
    看看 自己运行一下不就知道了吗
    实践啊!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • HelloDan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:36:028楼 得分:0
    能调用,能改变该函数指针的值,但好像不能改变那个函数。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liaoyonghan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:45:539楼 得分:0
    c语言里面函数名到底代表什么意思?是函数的入口地址?还是地址对应的内容?还是一块内存?

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mscf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:50:1310楼 得分:0
    指针指向的内容是代码,你修改这部分代码除非是想让程序立即被操作系统结束或者搞破坏活动,程序能修改的只是数据段的内容

    当然操作系统提供了一些读写虚拟内存的API,这样你就可以开辟自己的空间再写入函数代码,普遍的远程代码注入就是这样实现的

    个人认为应用程序或者模块初始化后代码数据是被保护起来的,修改这些内容会导致PGE
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liaoyonghan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 11:54:2811楼 得分:0
    不好意思,我提的问题是函数指针不是指针函数
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liaoyonghan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 12:05:5212楼 得分:0
    如果我们从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
    这句话没错.
    但是我就不理解下面的代码了?
    void func(void)
    {
    ...

    }
    int main()
    {
    void (*pFunc)(void);
    pFunc=func;
    cout < <func < <endl;//
    cout < <&func < <endl;//
    cout < <pFunc < <endl;
    cout < <*pFunc < <endl;
    }
    四个cout输出的值一样???这个到底怎么解释呢???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lunarfan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 12:39:3813楼 得分:0
    现在我想问的是,一个指向函数的函数指针,我们可以通过这个函数指针修改那个函数的内容吗??
    不能
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • liaoyonghan
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 14:32:4514楼 得分:0
    难道需要结贴了吗?!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Maxwell
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 15:19:2915楼 得分:0
    引用 12 楼 liaoyonghan 的回复:
    如果我们从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。
    这句话没错.
    但是我就不理解下面的代码了?
    void func(void)
    {
    ...

    }
    int main()
    {
    void (*pFunc)(void);
    pFunc=func;
    cout < <func < <endl;//
    cout < <&func < <endl;//
    cout < <pFunc < <endl;
    cout < <*pFunc < <endl;
    }
    四个cout输出的值一样???这个到底怎么解释呢???


    在c/c++中就是这么规定的,对函数指针用&和*与不用都是等价的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Hyuga
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 15:24:4816楼 得分:0
    这个问题有创意
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mscf
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 15:39:2517楼 得分:0
    引用 11 楼 liaoyonghan 的回复:
    不好意思,我提的问题是函数指针不是指针函数


    讨论的就是函数指针,说实在话还本人还么弄清楚什么是指针函数,楼主能否顺便解释下
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Yun0825
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 15:42:0218楼 得分:0
    在c/c++中就是这么规定的,对函数指针用&和*与不用都是等价的。
    ========================
    受教。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • NYE125
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 17:11:0519楼 得分:0
    http://blog.csdn.net/megaboy/archive/2005/09/17/482782.aspx

    详细的说明了数组名
    实质上,数组名与函数名是基本类似的
    不过用途不一样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xkyx_cn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

    发表于:2008-04-21 17:21:2120楼 得分:0
    显然是不能修改,代码所在的段为只读属性的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • simon031187
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 17:30:3421楼 得分:0
    改还是可以的,原理类似于内存补丁,不过感觉多此一举,自己有源码还非要绕个大弯
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • p0303230
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 17:36:0522楼 得分:0
    引用 11 楼 liaoyonghan 的回复:
    不好意思,我提的问题是函数指针不是指针函数

    大伙都在讨论函数指针啊

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • steedhorse
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 2

      3

      4

    发表于:2008-04-21 17:41:2323楼 得分:10
    在操作系统之上编程的话,应该是“根本不可能”,函数代码都在代码段中,代码段所占用的内存页面在运行时一般都被标记为“只读”的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • simon031187
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 18:02:1724楼 得分:0
    内存页面标记不能改吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • donkey20041121
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 18:49:0825楼 得分:0
    VirtualProtect这个api不是可以修改页属性么。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fallening
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 19:22:4626楼 得分:0
    引用 23 楼 steedhorse 的回复:
    在操作系统之上编程的话,应该是“根本不可能”,函数代码都在代码段中,代码段所占用的内存页面在运行时一般都被标记为“只读”的。

    有没有运行时绑定之类的函数可以修改?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jillnicky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 19:58:3427楼 得分:0
    一般都用来调用函数,也可以修改函数内容,但是要慎重。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jeff_nie
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 21:13:3928楼 得分:0
    学习.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • SiyuanAsp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 22:13:3229楼 得分:0
    有点儿晕
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangweixing2000
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-04-21 22:25:3530楼 得分:0
    引用 10 楼 mscf 的回复:
    指针指向的内容是代码,你修改这部分代码除非是想让程序立即被操作系统结束或者搞破坏活动,程序能修改的只是数据段的内容

    当然操作系统提供了一些读写虚拟内存的API,这样你就可以开辟自己的空间再写入函数代码,普遍的远程代码注入就是这样实现的

    个人认为应用程序或者模块初始化后代码数据是被保护起来的,修改这些内容会导致PGE


    同意mscf的说法,:),代码段是不可写的,被保护起来。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chenhj_wo
    • 等级:
    • 可用分等级: