Các lỗi về bộ nhớ khi dùng con trỏ năm 2024

Chúng ta đã bước đến bài học cuối cùng trong chương đầu tiên nói về các khái niệm cơ bản trong C++. Hãy chú ý, kiến thức trong bài học này tương đối khó hơn nếu so sánh với những gì đã học từ trước tới giờ.

Chủ đề về con trỏ luôn được coi là 1 trong những bài học khó nhất nhưng bắt buộc phải biết khi bạn học lập trình. Đây cũng là 1 trong những bài học phức tạp nhất trong giáo trình của chúng ta. Sau khi học xong và hiểu được nó, các bạn sẽ thấy rất nhiều thứ trở nên đơn giản và rõ ràng hơn nhiều.

Con trỏ được sử dụng trong tất cả các chương trình C++. Thậm chí kể cả bạn cũng đã sử dụng chúng mà không biết vì cho đến giờ thì các bạn vẫn chưa từng chính thức thao tác trực tiếp với chúng. Từ bài này sẽ bắt đầu, chúng ta sẽ học quản lý 1 cách tinh tế từng phần bộ nhớ của máy tính.

Như tôi đã nói nhiều lần, với những bài học khó, đừng ngại đọc đi đọc lại nhiều lần để hiểu rõ. Bài này được đánh giá với độ khó cao nên tôi sẽ không nghi ngờ là các bạn sẽ còn quay lại đây nhiều trong tương lai.

Các địa chỉ trong bộ nhớ

Các bạn có còn nhớ bài học về quản lý bộ nhớ trong đó tôi đã giới thiệu với các bạn về khái niệm biến chứ? Nếu không nhớ rõ, hãy đọc lại nó và trên hết là nhớ lấy các sơ đồ chúng ta đã vẽ để mô tả về bộ nhớ.

Chúng ta đã biết rằng khi chương trình khai báo 1 biến, máy tính sẽ “cho mượn” 1 chỗ trong bộ nhớ của nó và gắn lên đấy 1 cái nhãn có tên của biến.

int main[]{     int tuoiNguoiDung[16];     return 0; }

Đoạn mã trên đã được chúng ta biểu diễn thế này.

Đơn giản biết chừng nào ! Đáng buồn là tôi phải nói cho các bạn biết rằng tôi đã nói dối. Ít nhất tôi đã đơn giản hóa mọi thứ đi nhiều. Khi các bạn nhận ra rằng với máy tính mọi thứ đều được sắp xếp có trật tự và logic thì các bạn cũng sẽ thấy rằng hình vẽ trên của chúng ta không còn chính xác lắm.

Bộ nhớ của máy tính đúng thật là được tạo thành từ các ô nhớ, có thể lên đến hàng tỉ đối với 1 chiếc máy tính đời mới. Vậy nên cần có 1 hệ thống quản lý để giúp máy có thể tìm lại được ô nhớ mà mình cần. Vì thế mỗi ô nhớ bản thân nó sẽ gắn với 1 số thứ tự duy nhất mà chúng ta gọi là địa chỉ [address].

Trong sơ đồ chúng ta nhìn thấy các ô nhớ và cả địa chỉ của chúng. Chương trình chỉ sử dụng 1 ô nhớ để lưu trữ biến, đó là ô 53768.

! Ta không thể lưu 2 biến vào cùng 1 ô nhớ

Quan trọng ở đây là mỗi biến sở hữu 1 địa chỉ và mỗi địa chỉ chỉ ứng với 1 biến duy nhất.

Địa chỉ cung cấp cho ta 1 cách thức khác để có thể tiếp cận biến như trong hình. Vậy là ta sẽ có 2 cách:

  • Sử dụng tên biến như chúng ta vẫn làm từ trước đến giờ.
  • Sử dụng địa chỉ theo kiểu như yêu cầu máy tính “Hãy hiển thị giá trị ô 53768” hay “Hãy cộng giá trị của 2 ô 53768 và 12345”.

Vẫn là 1 số người hay thắc mắc sẽ hỏi là viêc này thì được lợi ích gì bởi vì sử dụng tên biến như những cái nhãn đã khá đơn giản và hiệu quả rồi. Đúng là như vậy, tuy nhiên, tôi chỉ có thẻ nói với các bạn, việc truy cập dựa vào địa chỉ đôi khi trong 1 số trường hợp là cần thiết.

Hãy bắt đầu bằng cách tìm ra đia chỉ của 1 biến nhé!

Hiển thị địa chỉ

Trong C++, để nhận lấy địa chỉ của 1 biến, chúng ta sử dụng dấu

include

using namespace std; int main[]{    int tuoi[16];    cout

Chủ Đề