实际参数无target属性时,子程序关联指针是否符合Fortran标准?
问题解答
这一行为完全符合Fortran标准,并非GCC 11.4.0的bug,具体原因如下:
1. 实参可定位性与哑元target属性的作用
当你将可定位的数据对象(比如代码里allocatable类型的数组arr)传递给带有target属性的哑元时,Fortran标准允许在子程序内部将指针关联到该哑元。此时指针实际关联的是实参的底层存储——可定位对象的存储在其生命周期内(从allocate到deallocate之间)持续有效,因此即使离开子程序作用域,指针与实参的关联关系也不会自动解除。
2. 代码逻辑分析
你的测试代码中:
- 主程序的
arr是allocatable数组,allocate后拥有合法且持续的存储; - 调用
assign_ptr时,arr被传递给带target属性的哑元arr,哑元相当于实参的"别名"; - 子程序内执行
ptr => arr,本质是让指针ptr关联到实参arr的存储; - 返回主程序后,
ptr_to_arr依然指向arr的存储,所以修改arr的值后,ptr_to_arr的内容同步变化,arr - ptr_to_arr结果全为0是必然的。
3. 注意事项
如果传递的实参是不可定位的普通变量(比如主程序中局部的非allocatable、非模块的普通数组/变量),此时将指针关联到带target属性的哑元会导致未定义行为——但你的代码中arr是allocatable类型,属于合法的可定位对象,因此不存在这个问题。
内容的提问来源于stack exchange,提问作者Andris R.
相关产品推荐
相关产品推荐

