为什么以下行为与行为相似:
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
Arr
和Arr_Access
是否具有相同的辅助功能级别?
答案 0 :(得分:3)
可访问性规则的设计(ARM 3.10.2(3))
[确保] [s]对象将至少与访问类型一样长,这反过来又确保访问值不能在以后指定不再存在的对象。
在您的情况下,访问类型在库级别声明,但正在访问的对象是本地的;所以访问值可能比Arr_Access
更长(例如通过传递给存储它的子程序)。
ARM遵循这一说法,声明您可以使用’Unchecked_Access
。