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

bmvo0sr5  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(138)

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

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

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

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

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

0g0grzrc

0g0grzrc1#

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

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

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

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

所以什么都没变。输出两个不同的实体:存储在变量(指针)中的值和变量本身的地址。
请注意,转换说明符p需要void *类型的指针,但函数指针可能不会转换为void *类型。

odopli94

odopli942#

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

相关问题