首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >递增函数指针

递增函数指针
EN

Stack Overflow用户
提问于 2011-02-23 07:39:02
回答 5查看 4.1K关注 0票数 10

我刚刚学习了函数指针(指向存储函数机器代码的地址的指针)。这让我想到了机器代码,以及它是如何存储在内存中的。

机器代码是否连续地存储在内存中,以便可以“手动”增加指针,直到它指向下一个/上一个函数?

这就是调试器的作用吗?他让我“看到”程序计数器在机器代码中的位置?

结论:一个人可以用函数指针编写一个原始的调试器?

我的理解是正确的,还是大错特错?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-23 07:48:55

有点。您假设函数在内存中的布局方式与源代码中的布局方式相同。最有可能的是,它们不会--编译器通常会随意地移动它们。

但是,您可以使用指向当前指令的指针单步执行代码,并将该计数器递增一定的量以转到下一条指令。但是,在这种情况下,我们将不再将其称为函数指针,因为它不仅仅指向函数的开头;相反,我们将其称为instruction pointer

事实上,这正是计算机的工作方式-它有一个称为program counter的特殊register,它总是指向当前指令,并在每条指令之后将其递增一定的量( GOTO命令相当于将一个值写入程序计数器)。

然而,在现实世界中,这不是how debuggers work -事实上,我甚至不确定是否有可能在C中有一个指针指向内存中的代码段,而不是函数指针。更可能的情况是,只有在需要模拟程序计数器时才需要使用此技术,例如为另一种处理器类型编写仿真器。

票数 4
EN

Stack Overflow用户

发布于 2011-02-23 08:02:18

使用我设法追踪到的C标准草案(N1124),我们有类似的规则。关于加法表达式的章节(§6.5.6/2)说

对于加法,两个操作数都应该是算术类型,或者一个操作数应该是指向对象类型的指针

对象类型在§6.2.5/1中定义为

存储在对象中或由函数返回的值的含义由用于访问它的表达式的类型确定。(声明为对象的标识符是最简单的表达式;类型在标识符的声明中指定。)类型分为对象类型(完全描述对象的类型)、函数类型(描述函数的类型)和不完整类型(描述对象但缺少确定其大小所需的信息的类型)。

由于函数类型与对象类型不同,这表明禁止对函数指针进行指针运算。

在C++中,此操作是非法的。§5.7/1中给出的指针相加的定义如下:

对于加法,两个操作数都应该是算术或枚举类型,,或者一个操作数应该是指向完全定义的对象类型的指针,而另一个操作数应该是整型或枚举类型。

但是,§3.9/9规定

对象类型是一个(可能是cv限定的)类型,它不是类型,也不是引用类型,也不是void类型。

总的来说,这意味着您不能在C++中递增函数指针。

希望这能有所帮助!

票数 8
EN

Stack Overflow用户

发布于 2011-02-23 07:45:09

您可以(或者至少可以)做这样的事情,但这绝对不是微不足道的。首先,您不能实际递增或递减函数指针--它指向一个地址,但指针计算通常以sizeof(pointed to type)为增量完成--但是对于函数,这是没有意义的,所以您不能对它进行数学运算。

大多数调试器(主要)通过使用将地址与行号、函数名、变量名等相关的调试信息来工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5085366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档