这里有两个函数指针调用,它们以不同的方式将返回值分配给变量。
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);
会提出错误。
为什么这两个不同的调用输出相同的值?
此代码中没有任何复杂和秘密。
int(*(*x)())[20]
表示 “将 x
声明为函数指针,返回指向 int
元素数组 20 的指针”*
两个UB:
int(*(*x)())[20] = &func;
- func
未返回指向数组 20 int
的指针(基本上它的类型错误)int *i = (*x)();
当您使用指向 int
数组的指针初始化指向 int
的指针时。这些指针不兼容。