对象-C++怎么打印函数地址内存结构是什么样的啊

问题描述

C++怎么打印函数地址内存结构是什么样的啊
#include <iostream>
using namespace std;
class Base
{
public:
    Base(){};
    ~Base(void){};

    void print(){};
    void address1(){};
    void address2(){};

public:
    int *aa;
    int iBase;
};

void (Base::*pf1) ();
void (Base::*pf2) ();

int main(int argc, const char * argv[]) {
    Base *b = new Base();

    cout << "对象地址:" << b << endl;
    cout << "成员*aa:   "<< &b->iBase << endl;
    cout << "成员iBase:   "<< &b->aa << endl;

    pf1 = &Base::address1;
    pf2 = &Base::address2;

    cout << "pf1:" << &pf1 << endl;
    cout << "pf2:" << &pf2 << endl;

    printf("pf1:%p
", pf1);
    printf("pf2:%p
", pf2);

    return 0;
}

打印结果:
对象地址:0x100105470
成员*aa: 0x100105478
成员iBase: 0x100105470
pf1:0x1000020e8
pf2:0x1000020f8
pf1:0x100000d20
pf2:0x100000d30

测试环境:mac 64位系统 应该跟 windows 64位效果差不多吧

1.这种打印 c++ 函数的地址方式对吗?

2.对象地址:0x100105470 和 成员iBase: 0x100105470 地址相同?

3.pf1:0x1000020e8 与 pf1:0x100000d20 这两个哪个才是这正的函数地址?

4.pf1:0x1000020e8 与 pf2:0x1000020f8 这两个地址差别怎么理解

5.0x100105470 这个地址怎么理解啊
0x代表16进制 后面的呢 1001 0547 0 怎么是 9 位啊 应该是 8位啊 “1”是符号位?

问题有点多谢谢各位大哥

解决方案

1.这种打印 c++ 函数的地址方式对吗?//打印地址 用 &pf1 取值就可以了
2.对象地址:0x100105470 和 成员iBase: 0x100105470 地址相同? //这个类结构里边,就两个成员且无虚函数,所以对象开始地址也是第一个成员的地址
3.pf1:0x1000020e8 与 pf1:0x100000d20 这两个哪个才是这正的函数地址? //前者,printf 忘了 &
4.pf1:0x1000020e8 与 pf2:0x1000020f8 这两个地址差别怎么理解 //说明 pf1所指函数实际占用16字节空间?
5.0x100105470 这个地址怎么理解啊
0x代表16进制 后面的呢 1001 0547 0 怎么是 9 位啊 应该是 8位啊 “1”是符号位? //1当然不是符号位,这都哪跟哪! 可能前边还有0,没打印出来

解决方案二:

 cout << "pf1:" << (int)pf1 << endl;

以这个为准。

解决方案三:

64位系统,地址不是32bit了。所以超过8位。

解决方案四:

1.这种打印 c++ 函数的地址方式对吗?//打印地址 用 &pf1 取值就可以了
cout << "pf1:" << pf1 << endl; 为什么打印固定式 1 ,pf1 明明是一个指针

    int aa = 0;
    int *a =&aa;
    cout << "aa地址:" << a << endl;//打印出来的是一个地址
        ```
4.pf1:0x1000020e8 与 pf2:0x1000020f8 这两个地址差别怎么理解 //说明 pf1所指函数实际占用16字节空间?
16字节的空间怎么理解
```cpp
void address1(){
            int a;
    };
    void address2(){};
//这两个都是差 16 字节
void address1(){
    };
    void address2(){};

最后一个还是关于地址的问题
函数地址:0x1001042a0
而打印 int 类型的地址
0x7fff5fbff838

64位地址应该都是占用 8 字节啊?

@西伯利亚冰
@cjqpker

解决方案五:

要想打印内存地址,用printf

解决方案六:

下班最后一次顶顶顶顶 回去终结结贴。
cout << "pf1:" << pf1 << endl; 为什么打印固定式 1 ,
cout << "pf1:" << pf1 << endl; 为什么打印固定式 1 ,

解决方案七:

打印函数地址

时间: 2024-09-15 02:30:11

对象-C++怎么打印函数地址内存结构是什么样的啊的相关文章

将指向结构体对象的指针作为函数参数,调用p-&amp;amp;gt;时调试报错

问题描述 将指向结构体对象的指针作为函数参数,调用p->时调试报错 void deleteelement(linearlist *list, int power) { linearlist *p = list; while (p->power != power && p->next != NULL) //调试时显示错误在这一行 { p = p->next; } if (p->power == power) { linearlist *dele = p; p =

玩转JVM虚拟机:JVM内存结构

视频请在wifi下观看(土豪随意~),视频包含内容整理如下: 一,JVM内存结构 (图片来自网络) 1. 程序计数器 程序计数器(Program Counter Register),也有称作为PC寄存器.在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址,当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的

JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素 数组的格式 //公共的 类 类名 public class HelloJJAVA { // 公共的 静态 无返回值 main方法 数组 public static void main(String[] str) { /** * 格式:元素类型

C++类对应的内存结构

提示1:对"内存结构"表示有疑问或不解的,先参考: http://blog.csdn.net/guogangj/archive/2007/05/25/1625199.aspx, 本文使用的表示方法和VC6的Memory视图一致,即:左上表示低位.   提示2:下文提到的"类大小"严格上来说是该类经过实例化的对象的大小.当然了,光研究长度的话,两者差别不大,因为:CClassA objA,sizeof(CClassA)和sizeof(objA)得到的结果都是一样的.

库缓存(Library Cache)内存结构

库缓存(Library Cache)内存结构 Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分. 一 , Library cache存放什么(存放的信息单元都叫做对象) ?   Library存放的信息单元都叫做对象,这些对象可以分为两类:  1. 存储对象  2. 过渡对象(游标Cursor,这里的游标指生成的可执行的对象, 运行相同SQL的多个进程可以共享该SQL产生的游标,节省内存.) A. 用户提交的SQL  B. SQL语句相关的

Java虚拟机的内存结构

我们都知道虚拟机的内存划分了多个区域,并不是一张大饼.那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快.是的,如果不进行区域划分,扔的时候确实痛快,可用的时候再去找怎么办呢,这就引入了第一个问题,分类管理,类似于衣柜,系统磁盘等等,为了方便查找,我们会进行分区分类.另外如果不进行分区,内存用尽了怎么办呢?这里就引入了内存划分的第二个原因,就是为了方便内存的回收.如果不分,回收内存需要全部内存扫描,那就慢死了,内存根据不同的使用功能分成不同的区域,

函数指针 c语言 指针-C语言 在函数里给结构体赋值

问题描述 C语言 在函数里给结构体赋值 求懂的人解释一下,谢谢 代码意思是想在传结构体指针给函数,在函数里面改变结构体各项的值,运行结果为:a和b的值能改变,但到打印指针c的时候,程序报错 #include struct stu { int a; int b; char *c; }; //给结构体s1初始化 void Fun(void *ptr) { char *s = (char *)malloc(10); s = "Hello World"; int *p = (int *)ptr

c语言-C语言中Free函数释放内存为何释放不了!!!!!!!

问题描述 C语言中Free函数释放内存为何释放不了!!!!!!! #include #include void testFree(char *par) { void*free(par); par = NULL; } int _tmain(int argc, _TCHAR* argv[]) { char path[10] = {"abc"}; char *str = (char *) malloc(100 *sizeof(char)); memset(str,0x00,100 *size

20150213关于共享池4-SQL内存结构父子游标

[20150213]关于共享池4x-SQL内存结构父子游标.txt --这个主要和recr和freeabl类似. --1.节约内存 --2.减少检索链表的时间. --3.oracle的算法规定,sql语句必须至少是一父一子的情况.很多情况下都是一父多子.也就是说,每个游标,oracle都会为它设置个父游标 --  如果有sql文本相同,但无法共享执行计划的情况出现,那就会出现一父多子的情况. --注意除了sql对象,共享池中其它类型的对象都没有父子游标的概念. --自己按照的介绍,重复测试一遍,