Search…

Cấp Phát Vùng Nhớ Động - Dùng Như Mảng Hai Chiều

07/09/20203 min read
Bài viết hướng dẫn cấp phát mảng động 2 chiều (hay nhiều chiều) thông qua thao tác con trỏ và cấp phát động.

Biến đổi mảng một chiều thành mảng nhiều chiều

Cấp phát động mảng 2 chiều có m dòng và n cột cũng tương tự cấp phát mảng 1 chiều có m*n phần tử và mảng này được chia làm m nhóm bằng nhau. Khi biết được vị trí của một phần tử sẽ tính được phần tử đó thuộc nhóm nào với vị trí của nó trong nhóm, điều ngược lại cũng đúng.

Việc tham chiếu vị trí của các phần tử giữa mảng 2 chiều và mảng một chiều diễn ra như sau:

  • Ở chiều thuận, với phần tử ở vị trí i, thì nó thuộc nhóm thứ i / n, và vị trí tương đối của nó trong nhóm là i % n (với n là kích thước của mỗi nhóm).
  • Ngược lại, với phần tử thuộc nhóm thứ g và vị trí tương đối của nó trong nhóm thứ gh thì vị trí của nó ở trong mảng là g*n + h.

Ví dụ: Có khai báo mảng 2 chiều với kích thước 2*3 như sau:

a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]

Mảng trên hoàn toàn có thể đưa về mảng 1 chiều và các phần tử trong mảng được tham chiếu trị số như sau:

a[0][0] a[0][1] a[0][2] a[0*3 + 0] a[0*3 + 1] a[0*3 + 2]
a[1][0] a[1][1] a[1][2] a[1*3 + 0] a[1*3 + 1] a[1*3 + 2]

Hoặc cũng có thể đưa mảng 1 chiều về mảng 2 chiều với các tham số vị trí như sau:

a[0] a[1] a[2] a[0/3][0%3] a[1/3][1%3] a[2/3][2%3]
a[3] a[4] a[5] a[3/3][3%3] a[4/3][4%3] a[4/3][4%3]

Phương pháp này cũng có thể được áp dụng cho mảng tĩnh.

Mảng nhiều chiều

Dùng con trỏ 2 cấp hay còn hiểu là con trỏ của con trỏ. Khi đó, sẽ có một con trỏ trỏ đến một vùng nhớ, vùng nhớ này chỉ lưu các con trỏ, các con trỏ trong vùng nhớ này sẽ trỏ tới dữ liệu trong các vùng nhớ khác.

Ví dụ: Mảng động với kích thước 3*4 được mô tả như hình bên dưới:

Con trỏ trỏ tới con trỏ trên C/C++
Con trỏ trỏ tới con trỏ trong C/C++

So sánh

PHƯƠNG PHÁP 1 PHƯƠNG PHÁP 2
Tiết kiệm bộ nhớ, chỉ dùng một con trỏ. Dùng nhiều con trỏ hơn, với mảng động 2 chiều - n hàng thì phải tốn n + 1 con trỏ.
Chỉ một vùng nhớ, đăng kí cấp phát 1 lần, giải phóng một lần. Đăng kí cấp phát nhiều lần, giải phóng nhiều lần.
Nếu bộ nhớ phân mảnh quá nhiều thì có khả năng không tìm được vùng nhớ có kích thước thích hợp. Dữ liệu được chia nhỏ và lưu trữ ở nhiều nơi, đây là một nguyên nhân dẫn đến phân mảnh bộ nhớ. Nếu có nhu cầu sử dụng bộ nhớ trong khoảng thời gian dài thì nên tránh dùng cách này.
Không linh động trong việc các nhóm phần tử có kích thước khác nhau. Linh động hơn trong việc cấp phát bộ nhớ và quản lí các nhóm phần tử có độ lớn khác nhau.

Việc cấp phát mảng động với các nhóm phần tử có kích thước khác nhau có thể tổ chức bằng cách dùng một mảng khác để lưu kích thước của các nhóm hoặc có thể tổ chức lưu các kích thước này cùng với dữ liệu.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024