为什么 printf 会改变函数指针的地址?

问题描述 投票:0回答:2

printf 中的寻址运算符将函数指针的地址从常规地址更改为 0x1000。为什么会发生这种情况,这意味着什么?

#include <stdio.h>
int main()
{
    int (*fp) (int);
    printf("%p\n", (fp));
    printf("%p", (fp));
}

当我运行这个时,我得到

0x560cb44ce060 0x560cb44ce060
正如预期的那样,但是当我运行这个

#include <stdio.h>
int main()
{
    int (*fp) (int);
    printf("%p\n", (fp));
    printf("%p", &(fp));
}

ı 得到

0x1000 0x7ffcc92c8990
当我在最后一行添加
&
运算符时,我真的不知道会发生什么变化。

c++ c printf function-pointers memory-address
2个回答
0
投票

在使用

printf
的第一种情况下,输出未初始化的指针
fp
(它的垃圾值)

int (*fp) (int);
printf("%p\n", (fp));`

在使用 printf 的第二种情况下,输出指针的有效地址

fp
本身

printf("%p", &(fp)); 

所以没有任何改变。输出了两个不同的实体:存储在变量(指针)中的值和变量本身的地址。


0
投票

也许你混淆了指针指向的地址和指针的地址。 第一个 %p 将输出 fp 保存的地址(尽管它是垃圾值,因为你没有初始化它),第二个将输出 fp 的地址。

© www.soinside.com 2019 - 2024. All rights reserved.