月影梦 发表于 2022-12-8 09:18:56

函数指针指向具体函数前后映射到内存地址空间格式的不同

int add()
{
return 0;
}


int main()
{
    int (*func)(void);
//func=add;
   cout<<(void *)func<<endl;
}

func 不指向某个具体函数后打印出的地址为0x4a,
func指向具体函数例如上面的add函数时,打印出的地址格式普通指针的地址格式相同。
想问下各位大佬,这个函数指针在没指向函数前它的映射地址空间有没有个具体名词,这个函数指针从创建不指向函数到指向函数的流程中地址变化是否要遵循什么规则
,还是说只是按照两种不同格式随机分配,在指向具体函数后,之前的那个内存空间是释放了还保存着。

jackz007 发表于 2022-12-8 10:45:18

      没有那么深沉,func 只不过就是一个指针变量而已,可以被赋值为任何一个有效的内存地址,无论指向一个变量还是一个函数,指针本身并没有本质的区别。之所以要把指针的类型定义清楚,只不过是为了明确在对指针进行 + 1、-1 操作时的具体行为。

xiaotubie 发表于 2022-12-8 10:50:41

本帖最后由 xiaotubie 于 2022-12-8 10:54 编辑

申明指针没有赋值的时候,在栈中分配了一块空间,这块空间没有初始值,那什么值都有可能的,有可能是上次在这个栈中初始化过的数据,也有可能编译器给初始化一个00,cc 等。如果你不小心打印文字,可能就出来什么“烫烫烫”这种莫名其妙的文字
直接使用一个未初始化的变量,是不允许的,有的编译器会直接报错的,有的编译器不报错,那么结果也是预料不到的。
没有所谓之前的那个空间,空间是同一个的。只是一个你给这个空间初始化了,一个没有初始化而已。
就像你去租房,内存就像房间,你可能把你自己的东西搬进去,你也可能直接用上次租客留下来的床啊,被子啊(假如房东没清理),这种情况就预料不到了,有可能不干净,用了你就生病了。
你把自己的东西搬到这个房间,就像你给指针初始化了,那这个你应该是能确保干净,用着是没问题的。
页: [1]
查看完整版本: 函数指针指向具体函数前后映射到内存地址空间格式的不同