Einzelnen Beitrag anzeigen

kmma

Registriert seit: 26. Jul 2010
9 Beiträge
 
Delphi 2 Desktop
 
#1

Verständnisfrage offene Arrays, move und setlength

  Alt 6. Apr 2023, 15:02
Gegeben sei folgendes Konstrukt:
Delphi-Quellcode:
type Tx = packed record
    a: integer;
    b: integer;
    end;
type TY = packed record
    c: integer;
    d: integer;
    end;
type TRec = packed record
    X: array of Tx;
    Y: array of TY;
    end;
var R: TRec;
Was passiert genau, wenn ich jetzt etwas mehr oder weniger willkürliches in R per "move" schiebe?

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
    var x, sr, lx, ly, vx: integer;
begin
    sr := sizeof(R); // 8
    x := integer(@x); // irgendeine Adresse
    move(x, R, 8);
    lx := length(R.x); // zufällige Zahl, hier ziemlich groß
    ly := length(R.y);
    vx := R.x[1].a; // geht
    vx := R.x[lx - 1].a; // Zugriffsverletzung beim lesen
Ich vermute, dass der erste Zugriff (R.x[1].a) noch geht, weil sich dieser Wert noch in meinem Speicherbereich befindet, der zweite Zugriff (vx := R.x[lx - 1].a) aber nicht weil die Adresse davon außerhalb meines Speichersegmentes liegt.
Stimmt das soweit?

Delphi-Quellcode:
    
    lx := length(R.x); // zufällige Zahl
    // fillchar(R, sizeof(R), 0); // mit fillchar alles ok, ohne Crash
    setlength(R.x, 100000);
Wenn ich jetzt direkt versuche, die Größe des Array zu ändern crasht das ganze wieder. Ich vermute, dass hier Speicher freigegeben würde, der mir nicht gehört. Ist das richtig?
Wenn ich mit fillchar meine Variable R aber zuvor auf 0 setze geht wei erwartet alles. Die Frage ist hier: Habe ich in der Zwischenzeit schon irgendeine Verletzung vorgenommen?
Sprich wird nur mit der (zugegebenermaßen sinnlosen) Zuordnung

Delphi-Quellcode:
    move(x, R, 8);
    fillchar(R, sizeof(R), 0);
bereits irgendeine Verletzung vorgenommen oder werden da nur die 8 Byte, die für die Variable R reserviert sind, zweimal überschrieben und sonst passiert nichts?
Wird mit dem ersten move schon irgend ein Speicherbereich verändert außer den 8 Byte die zu "R" gehören?
Mir geht es rein um das Verständnis, nicht darum, ob der Code sinnvoll ist oder nicht.
  Mit Zitat antworten Zitat