You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中两种不同函数指针调用返回相同值的原因探究

为何两种函数指针调用会输出相同结果

先明确核心问题:你定义的函数指针x类型是int(*(*x)())[20]——这是一个指向「返回值为20元素int数组指针」的函数的指针,但你把返回int*的func的地址赋值给了它,这属于类型不匹配的非法赋值,严格来说是C标准中的未定义行为。只是在多数现代系统中,指针的存储大小一致,才没直接报错,反而表现出预期结果。

下面拆解两种调用的逻辑:

1. int *i = (*x)();

  • 调用(*x)()实际执行的是func,但编译器会将func返回的int*强制解释为int(*)[20](数组指针)类型。
  • 在C中,数组指针的值等于它指向的数组第一个元素的地址,所以int(*)[20]类型的指针,其存储的地址和对应的int*地址完全相同。赋值给int* i时,这个地址直接被复用,因此i就是func返回的原始指针。

2. int *p = *(*x)();

  • 第一步(*x)()同样得到被解释为int(*)[20]的返回值(即func返回的int*地址)。
  • 对这个数组指针解引用*(*x)(),得到的是int[20]类型的数组。而在表达式语境中,数组会自动转换为指向其第一个元素的int*指针,这个指针的地址和原数组指针的地址完全一致,也就是func返回的原始指针。
  • 最终p和i指向同一个地址,所以输出结果自然相同。

重要提醒

这段代码的行为完全是依赖编译器和平台的侥幸结果,属于标准未定义行为。如果换用指针大小不同的平台,或者开启严格编译选项(比如GCC的-Wall -Werror),代码要么编译失败,要么运行崩溃。正确的写法是让函数指针类型与目标函数严格匹配,比如将x的类型改为int*(*x)(),这样就不会存在类型不匹配的问题。

内容的提问来源于stack exchange,提问作者shayan rok rok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:25:17