給結構體指標分配記憶體

2022-06-09 04:39:08 字數 3913 閱讀 2997

使用結構或結構陣列, 一般是不需要主動分配記憶體的, 譬如:

var

pts: tpoint;

begin

pts.x := 1

;

pts.y := 2

;

showmessagefmt('%d,%d'

, [pts.x, pts.y]);

end;

//結構陣列:

var

arr:array[0

..2

]oftpoint;

i: integer;

begin

fori := 0

tolength(arr) - 1

do

begin

arr[i].x := i;

arr[i].y := trunc(sqr(i));

end;

showmessagefmt('%d,%d'

, [arr[high(arr)].x, arr[high(arr)].y]);

end;

但在很多時候, 一些引數是結構指標; 特別是在接受資料時, 一般需要手動分配記憶體. 如果只使用乙個單結構指標, 用 new 分配記憶體是最合適的, 譬如:

var

p: ppoint;

begin

new(p);

// p^.x := 1; p^.y := 2;

p.x := 1

; p.y := 2

;

showmessagefmt('%d,%d'

, [p.x, p.y]);

dispose(p);

end;

更多時候, 我們需要給乙個結構指標分配更多容量; getmem 可以很容易地完成這個任務, 關鍵是如何訪問. 譬如:

var

p: ppoint;

begin

p := getmemory(4

* sizeof(tpoint));

p.x := 1

; p.y := 11

;

showmessagefmt('%d,%d'

, [p.x, p.y]);

freememory(p);

end;

//訪問給結構指標分配的其他元素:

var

p: ppoint;

buf:array[0

..255

]ofchar;

begin

p := getmemory(4

* sizeof(tpoint));

p.x := 1

; p.y := 11

;

inc(p);

p.x := 2

; p.y := 22

;

inc(p);

p.x := 3

; p.y := 33

;

inc(p);

p.x := 4

; p.y := 44

;

dec(p, 3

);

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d'

, pchar(p));

showmessage(buf);

freememory(p);

end;

如上的操作簡直太殘忍了, 幸虧資料少; 其實這種情況應該用陣列, 這裡提供一種更巧妙的辦法 - 轉換(為陣列型別):

var

p: ppoint;

i: integer;

buf:array[0

..255

]ofchar;

type

arrpoint =arrayoftpoint;

begin

p := getmemory(4

* sizeof(tpoint));

fori := 0

to3

do

begin

arrpoint(p)[i].x := i;

arrpoint(p)[i].y := i * i;

end;

wvsprintf(buf, '%d,%d; %d,%d; %d,%d; %d,%d'

, pchar(p));

showmessage(buf);

freememory(p);

end;

給資料指標分配記憶體

對靜態陣列指標,雖然在宣告之處並沒有分配記憶體,但這個指標應該分配多少記憶體是有定數的.這種情況,我們應該用 new 和 dispose 來分配與釋放記憶體.譬如 type tarr1 array 0.255 ofchar tarr2 array 0.255 ofinteger var arr1 t...

C C 中結構體變數與結構體指標記憶體分配問題

宣告乙個結構體變數,無論是否初始化,都開闢記憶體,宣告乙個結構體指標變數,對其初始化的時候才會開闢記憶體。a a 3 a是a型的,有3個,當然分配a乘3大小的空間 a a a是a 型的,當然只分配a 大小的空間,而不會分配a大小的空間 好像跟你說的不太一樣,結構體陣列的話,我在課本裡看到的確不用再次...

結構體的記憶體分配

記憶體大小和系統有關,如32位系統和64位系統,同一資料型別,記憶體分配大小不一 假設這台機器是sizeof char 1 sizeof int 4 sizeof double 8 列舉型別只為最寬的資料分配記憶體,在不同的時候,用的是同一塊記憶體 在預設情況下,規定各成員變數的起始位址相對於結構的...