这是我为学校项目制作的两个链接列表...... 我想要从第二个调用第一个列表,我已经完成了,并且在编译时一切正常。当我运行它时说: Project(myProject)提出异常类'外部:SIGSEGV'。 地址为40D32D 这是我的代码:
list2=^ptr;
ptr=record
vlera:integer;
pozicioni:integer;
end;
type
list=^pointer;
pointer=record
rreshti:list2;
end;
var
a:array[1..7] of list;
i:integer;
kjovlere:list2;
begin
for i:=1 to 7 do begin
a[i]:=@kjovlere;
write('Give the pozition for the row:',i,' : ');
read(a[i]^.rreshti^.pozicioni);
write ('give the value for this poziton :');
read(a[i]^.rreshti^.vlera);
writeln;
end;
end.
错误发生在read(a[i]^.rreshti^.pozicioni);
的for循环中
如果有人解释我或给我任何建议,我将非常感激:)
答案 0 :(得分:4)
提供的源代码至少显示有关Pascal中指针管理的两个误解。
主要问题 - 要分配数据,应在之前分配
record
类型。
此问题涉及行read(a[i]^.rreshti^.pozicioni);
和read(a[i]^.rreshti^.vlera);
。
a[i]
和rreshti
都被声明为指针类型(list=^pointer;
& list2=^ptr;
),并且在分配数据之前应分配给记录结构。
Step1 :在循环中分配a[i]
指针。
new(a[i]);
Step2 :在循环中分配a[i]^.rreshti
指针。
new(a[i]^.rreshti);
奇怪的问题 - 指定
record
类型的指针应尊重目的地类型。
此问题涉及行a[i]:=@kjovlere;
。
a[i]
是list
,list=^pointer;
而非list2
(list2=^ptr;
)为kjovlere:list2;
宣告。
解决方案是:删除该行a[i]:=@kjovlere;
。
<强>解决方案:强>
begin
for i:=1 to 7 do begin
(* a[i]:=@kjovlere; to be removed *)
new(a[i]);
new(a[i]^.rreshti);
write('Give the pozition for the row:',i,' : ');
read(a[i]^.rreshti^.pozicioni);
write ('give the value for this poziton :');
read(a[i]^.rreshti^.vlera);
writeln;
end;
end.