Pascal链表到链表不起作用

时间:2017-02-12 09:23:04

标签: pointers linked-list pascal lazarus

这是我为学校项目制作的两个链接列表...... 我想要从第二个调用第一个列表,我已经完成了,并且在编译时一切正常。当我运行它时说: 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循环中 如果有人解释我或给我任何建议,我将非常感激:)

1 个答案:

答案 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]listlist=^pointer;而非list2list2=^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.