Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 用fortran语言破解指针 让我们考虑FORTRAN 中的一个复杂结构 TYPE ComplexStrType ! Static as well as dynamic memory defined here. END TYPE ComplexStrType_Pointers_Memory Management_Fortran_Dynamic Memory Allocation_Stack Memory - Fatal编程技术网

Pointers 用fortran语言破解指针 让我们考虑FORTRAN 中的一个复杂结构 TYPE ComplexStrType ! Static as well as dynamic memory defined here. END TYPE ComplexStrType

Pointers 用fortran语言破解指针 让我们考虑FORTRAN 中的一个复杂结构 TYPE ComplexStrType ! Static as well as dynamic memory defined here. END TYPE ComplexStrType,pointers,memory-management,fortran,dynamic-memory-allocation,stack-memory,Pointers,Memory Management,Fortran,Dynamic Memory Allocation,Stack Memory,定义了一个物理空间(我认为是在堆栈内存上分配的)以使用ComplexStrType的两个变量: TYPE(ComplexStrType) :: SomeComplexStr TYPE(ComplexStrType) :: AnotherComplexStr TYPE(ComplexStrType),POINTER :: PointerComplexStr 然后,我使用SomeComplexStr在堆栈中定义一些内容,并在动态内存中分配一个大空间 现在,假设

定义了一个物理空间(我认为是在堆栈内存上分配的)以使用ComplexStrType的两个变量:

TYPE(ComplexStrType)          :: SomeComplexStr
TYPE(ComplexStrType)          :: AnotherComplexStr
TYPE(ComplexStrType),POINTER  :: PointerComplexStr
然后,我使用
SomeComplexStr
在堆栈中定义一些内容,并在动态内存中分配一个大空间

现在,假设我想将另一个complexstr指向
SomeComplexStr
,并忘记我在堆栈内存中定义的空间指向另一个complexstr。为此,我使用了一个简单但有用的技巧,将某个变量转换为
目标

FUNCTION TargComplexStr(x)

    IMPLICIT NONE

    TYPE(ComplexStrType),INTENT(IN),TARGET  :: x
    TYPE(ComplexStrType),POINTER            :: TargComplexStr

    TargComplexStr => x

END FUNCTION TargComplexStr
然后我将
PointerComplexStr
指向
SomeComplexStr

PointerComplexStr => TargComplexStr(SomeComplexStr)
AnotherComplexStr = PointerComplexStr
最后,我做另一个complexstr等于
PointerComplexStr

PointerComplexStr => TargComplexStr(SomeComplexStr)
AnotherComplexStr = PointerComplexStr
在那之后,假设
SomeComplexStr
以及
另一个complexstr
指向相同的静态和动态内存。 问题是:

  • 我如何释放
    另一个complexstr
    使用的空间,当我在Begging中定义它时使用它
  • 你如何建议我取消指针
  • 这种做法是安全的,还是我必须预期在执行过程中会出现一些奇怪的内存泄漏
  • 如果可能,我如何将“定点变量”指向其原始形式?(以防万一,我不得不再次将其用作正常变量)
注意:这很有用,因为在执行过程中,我们可以决定是否要使用另一个complexstr,一个复杂的分配结构,或者我们可以将其切换为指针,并将其指向另一个已经具有我们所需信息的对象。如果有另一种简单的方法,请告诉我。

您在
targetcomplexstr
中使用的“技巧”与您认为的不一样-该函数与简单的指针分配相比没有任何用处

您可以将非目标实际参数与目标伪参数相关联,但当带有目标伪参数的过程完成时,与伪参数关联的任何指针都将变得未定义(F2008 12.5.2.4 p11)

(指针只能与目标关联,因此非目标的东西不能有与之关联的指针。)

这意味着函数的结果是一个具有未定义关联状态的指针。不允许从函数返回具有未定义关联状态的指针(F2008 12.6.2.2 p4)

指针赋值语句将使
PointerComplexStr
成为未定义的指针<代码>指针complexstr然后在分配中被引用到另一个complexstr。不允许引用未定义关联状态的指针(F2008 16.5.2.8 p1)

内在赋值创建值的副本。即使右侧的对象是指针,也会出现这种情况—将创建该指针目标值的副本。内在赋值不会在被赋值的顶级数据对象[1]级别上使一个变量引用另一个变量的存储。据我所知,您整个示例代码的意图可以替换为:

AnotherComplexStr = ComplexStr
如果你想做一些不同的事情,那么你需要解释你想做什么

[1] :如果指定的对象类型是具有指针组件的派生类型,则对象值的定义包括指针组件的指针关联状态,但不包括组件本身目标的值(F2008 4.5.8)。

技巧您在
TargComplexStr
中使用的函数不能按您认为的方式工作-该函数与简单的指针赋值相比没有任何用处

您可以将非目标实际参数与目标伪参数相关联,但当带有目标伪参数的过程完成时,与伪参数关联的任何指针都将变得未定义(F2008 12.5.2.4 p11)

(指针只能与目标关联,因此非目标的东西不能有与之关联的指针。)

这意味着函数的结果是一个具有未定义关联状态的指针。不允许从函数返回具有未定义关联状态的指针(F2008 12.6.2.2 p4)

指针赋值语句将使
PointerComplexStr
成为未定义的指针<代码>指针complexstr然后在分配中被引用到另一个complexstr。不允许引用未定义关联状态的指针(F2008 16.5.2.8 p1)

内在赋值创建值的副本。即使右侧的对象是指针,也会出现这种情况—将创建该指针目标值的副本。内在赋值不会在被赋值的顶级数据对象[1]级别上使一个变量引用另一个变量的存储。据我所知,您整个示例代码的意图可以替换为:

AnotherComplexStr = ComplexStr
如果你想做一些不同的事情,那么你需要解释你想做什么


[1] :如果要分配的对象类型是具有指针组件的派生类型,则对象值的定义包括指针组件的指针关联状态,但不包括组件本身目标的值(F2008 4.5.8)。

我不明白您试图做什么,但是函数
TargComplexStr
没有用处-它要么复制了普通指针赋值的功能,要么导致未定义的指针。如果
AnotherComplexStr
不是指针,那么它就不能出现在指针赋值语句的左侧。我也不明白这一点,如果AnotherComplexStr不是指针,那么AnotherComplexStr=>targetcompl