两个不同的函数指针调用在 C 中返回相同的值

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

这里有两个函数指针调用,它们以不同的方式将返回值分配给变量。

int *func()
{
    int *i = calloc(2, sizeof(int));
    *i = 100;
    *(i + 1) = 200;
    printf("i address: %p\n", i);
    return i; // or 0, both represent a null pointer
}

int main()
{
    int(*(*x)())[20] = &func;
    int *i = (*x)();
    int *p = *(*x)();
    printf("%d\n", *p);
    printf("%d\n", *i);

    return 0;
}

代码输出:

i address: <some address>
i address: <some address>
100
100

我预计

int *p = *(*x)(); printf("%d\n", *p);
会提出错误。

为什么这两个不同的调用输出相同的值?

arrays c pointers
1个回答
0
投票

此代码中没有任何复杂和秘密。

int(*(*x)())[20]
表示 “将
x
声明为函数指针,返回指向
int
元素数组 20 的指针”
*

两个UB:

  • int(*(*x)())[20] = &func;
    -
    func
    未返回指向数组 20
    int
    的指针(基本上它的类型错误)
  • int *i = (*x)();
    当您使用指向
    int
    数组的指针初始化指向
    int
    的指针时。这些指针不兼容。
© www.soinside.com 2019 - 2024. All rights reserved.