Mảng động - Static Array

HI Thân Hoàng.
realloc() phần dữ liệu cũ bảo toàn. Tuy nhiên nó làm phân mảnh bộ nhớ dẫn đến các hậu quả xấu.
Thường thì dùng danh sách liên kết cho các trường hợp cần cấp phát nhiều liên tục hoặc chiến lược cấp phát lại theo kiểu vector cấp phát gấp đôi. (bạn có thể xem một bài đánh giá của anh Dạt về các kiểu dữ liệu lưu trữ trong C++).

P/S Nếu bạn là người mới thì nên bắt đầu với các kiến thức cơ bản như debug và C cơ bản sau đó là cấu trúc dữ liệu và giaỉ thuật khi đó bớt được nhiều câu hỏi.

1 Like

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::liststd::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 :))
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?