非本地指针不能指向本地对象

时间:2018-02-23 01:32:31

标签: ada

为什么以下行为与行为相似:

with Interfaces.C;
with Interfaces.C.Strings;
procedure X is

   type Integer_Access is access all Integer;

   Arr_Access : Interfaces.C.Strings.char_array_access;
   Arr : aliased Interfaces.C.char_array := Interfaces.C.To_C ("From");

   A : Integer_Access;
   I : aliased Integer := 6;

begin

   Arr_Access := Arr'Access;
   A := I'Access;

end X;

结果:

$ gnatmake x.adb 
gcc -c x.adb
x.adb:16:18: non-local pointer cannot point to local object
gnatmake: "x.adb" compilation error

ArrArr_Access是否具有相同的辅助功能级别?

1 个答案:

答案 0 :(得分:3)

可访问性规则的设计(ARM 3.10.2(3)

  

[确保] [s]对象将至少与访问类型一样长,这反过来又确保访问值不能在以后指定不再存在的对象。

在您的情况下,访问类型在库级别声明,但正在访问的对象是本地的;所以访问值可能比Arr_Access更长(例如通过传递给存储它的子程序)。

ARM遵循这一说法,声明您可以使用’Unchecked_Access