将带save属性的局部target变量暴露到外部的Fortran代码是否合法?
Fortran代码合法性判定
核心结论
你提供的代码完全符合Fortran 2003及所有更高版本标准的要求,是合法代码,甚至在最早支持指针特性的Fortran 90标准下也合法。
判定依据
- 标准明确规定,带有
SAVE属性的过程内部局部变量,生命周期和整个程序的运行周期完全一致,不会在过程执行结束后被释放回收。 - 只要被指针指向的
target实体的生命周期尚未结束,对应的指针关联关系就合法有效。你代码里的internal_n显式声明了SAVE+TARGET属性,get_number函数执行结束后它的存储依旧保留,外层指针ptr指向它的关联关系全程有效,读写ptr的行为也完全符合标准要求。 - 如果删除
internal_n的SAVE属性,代码就会变成不符合标准的非法实现:无SAVE属性的过程局部变量在过程退出后生命周期立刻结束,此时返回的指针会变成悬空指针,属于标准未定义行为。
内容的提问来源于stack exchange,提问作者mcocdawc
相关产品推荐
相关产品推荐

