Cấu trúc mảng vốn không phải là cấu trúc động, khi có một khai báo mảng, ta luôn cần biết trước kích thước để hệ điều hành cấp phát bộ nhớ cố định.
Mảng động như bài viết thực chất là một con trỏ được khởi tạo dưới dạng một mảng. Như vậy thì đối với mảng này, kích thước vẫn là phải biết trước, nhưng đối với biến con trỏ thực sự thì không biết được người dùng sẽ khai báo mảng này ra sao. Như vậy đã được coi là động rồi.
Để phục vụ việc lưu trữ dữ liệu mà không biết trước kích thước hoặc muốn dùng đến đâu cấp phát đến đấy để tiết kiệm bộ nhớ, ta có thể dùng realloc() như mọi người nói ở trên, bản chất không phải là cấp thêm ô nhớ cho một mảng, mà là khởi tạo một mảng mới cho con trỏ cũ, mảng mới này trùng vị trí với mảng cũ và các ô nhớ chưa bị xoá. Nhưng nó cũng ẩn chứa nhiều nguy cơ về vấn đề xung đột vùng dữ liệu.
Thế nên, người ta mới phát minh ra nhiều cấu trúc dữ liệu động thực sự:
- Đơn giản nhất là danh sách liên kết đơn (Tự code)
- Cao cấp hơn tí là danh sách liên kết đôi (Tự code)
- Trong C++ thì có sẵn
std::list
và std::vector
, nói chung thì dùng vector
khá là khoái, nếu bạn không đặt nặng vấn đề hiệu năng, tốc độ… thì quên mảng đi :))