使用結構或結構陣列, 一般是不需要主動分配記憶體的, 譬如:
varpts: 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 分配記憶體是最合適的, 譬如:
varp: 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 可以很容易地完成這個任務, 關鍵是如何訪問. 譬如:
varp: 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;
如上的操作簡直太殘忍了, 幸虧資料少; 其實這種情況應該用陣列, 這裡提供一種更巧妙的辦法 - 轉換(為陣列型別):
varp: 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 列舉型別只為最寬的資料分配記憶體,在不同的時候,用的是同一塊記憶體 在預設情況下,規定各成員變數的起始位址相對於結構的...