CÁCH SỬ DỤNG CHỨC NĂNG MALLOC TRONG C

How Use Malloc Function C



Malloc là một hàm tích hợp được khai báo trong tệp tiêu đề. Malloc là tên viết tắt của 'cấp phát bộ nhớ' và được sử dụng để cấp phát động một khối bộ nhớ lớn liền kề theo kích thước được chỉ định. Có hai kiểu cấp phát bộ nhớ tĩnh và động. Việc phân bổ bộ nhớ tĩnh được thực hiện tại thời điểm biên dịch và nó không thay đổi trong thời gian chạy. Cấp phát bộ nhớ động là cấp phát bộ nhớ trong thời gian chạy cho việc này; chúng tôi sử dụng malloc. Bây giờ vấn đề là nơi từ bộ nhớ này đến, vì vậy tất cả các yêu cầu động trong C đều được đáp ứng từ bộ nhớ heap. Về cơ bản, ứng dụng / chương trình của chúng ta sẽ có 3 loại bộ nhớ

  • Bộ nhớ ngăn xếp là cục bộ cho mọi phương thức và khi phương thức trả về, ngăn xếp sẽ tự động xóa nó.
  • Vùng bộ nhớ toàn cục cấp phát bộ nhớ cho tất cả các biến toàn cục. Vùng nhớ này được tạo khi bắt đầu chương trình, và cuối cùng, nó sẽ tự động xóa vùng nhớ.
  • Bộ nhớ Heap luôn đáp ứng mọi yêu cầu động của chương trình / ứng dụng. Bất cứ khi nào chúng ta sử dụng hàm malloc, nó sẽ mượn một số bộ nhớ từ heap và cung cấp cho chúng ta con trỏ tới nó.

Cú pháp:







Cú pháp của malloc là (void *) malloc (size_t size). Vì vậy, cú pháp nói rằng malloc yêu cầu một kích thước, nó sẽ trả về con trỏ về cơ bản là một con trỏ void và kích thước t được định nghĩa là một số nguyên không dấu. Hàm Malloc chỉ đơn giản là phân bổ một khối bộ nhớ theo kích thước được chỉ định trong heap như bạn có thể thấy trong cú pháp mà kích thước cần được chỉ định và khi thành công, nó trả về một con trỏ trỏ đến byte đầu tiên của bộ nhớ được cấp phát khác trả về NULL . Vì vậy, công việc của malloc là cấp phát bộ nhớ trong thời gian chạy.



Tại sao con trỏ void:

Malloc không biết nó đang trỏ đến cái gì; nó chỉ đơn giản có nghĩa là nó không biết dữ liệu nào sẽ lưu trữ trong vị trí bộ nhớ đó. Nó chỉ đơn thuần cấp phát bộ nhớ do người dùng yêu cầu mà không cần biết loại dữ liệu sẽ được lưu trữ bên trong bộ nhớ. Đó là lý do tại sao nó trả về một con trỏ void.



Malloc chỉ cấp phát bộ nhớ sau đó người dùng có trách nhiệm đánh máy vào một kiểu thích hợp để nó có thể được sử dụng đúng cách trong chương trình. Con trỏ Void là một con trỏ có thể trỏ bất kỳ loại dữ liệu nào. Malloc trả về con trỏ void vì nó không biết loại dữ liệu nào sẽ được lưu trữ bên trong bộ nhớ đó.





Ở đây chúng tôi yêu cầu malloc cấp phát 6 byte bộ nhớ ngay bây giờ nếu thành công, malloc sẽ trả về một con trỏ void. Trong trường hợp đó, chúng ta phải nhập nó vào một con trỏ kiểu số nguyên vì chúng ta muốn lưu trữ một số nguyên trong bộ nhớ đó. Ở đây malloc phân bổ 6 byte bộ nhớ trong một heap và địa chỉ của byte đầu tiên được lưu trong con trỏ ptr.



Chương trình ví dụ:

Đây là một chương trình ví dụ đơn giản để hiểu khái niệm về malloc một cách thích hợp.

Ở đây bạn có thể thấy với hàm printf tôi đang yêu cầu người dùng nhập số lượng nguyên. Chúng tôi đã khai báo hai biến trên i và n. Biến n là nơi lưu trữ số do người dùng nhập vào. Sau đó, chúng ta có hàm malloc; chúng ta muốn malloc phân bổ kích thước tương đương với kích thước của n số nguyên. Chúng tôi đang nhân kích thước nếu int với n; điều này sẽ cho chúng ta kích thước của n số nguyên. Sau đó, malloc sẽ trả về một con trỏ void và chúng ta đang đánh máy nó vào một con trỏ số nguyên và chúng ta đang lưu trữ địa chỉ trong con trỏ ptr. Đánh máy rất quan trọng vì nó là một thực hành tốt.

Bây giờ, nếu con trỏ chứa NULL, điều đó có nghĩa là bộ nhớ không khả dụng. Vì vậy, chúng tôi sẽ chỉ thoát ra khỏi chương trình với trạng thái thất bại thoát. Nếu không đúng như vậy, chúng ta có thể dễ dàng chạy vòng lặp for.

Vòng lặp sẽ chạy từ 0 đến n-1 và chúng tôi sẽ yêu cầu người dùng nhập từng số nguyên một. Trong hàm scanf, có một thứ được viết ptr + i như chúng ta biết rằng ptr chứa địa chỉ của byte đầu tiên của bộ nhớ. Giả sử địa chỉ đó là 1000 ở đây tôi bằng 0 lúc đầu nên 1000 + 0 là 1000 vì vậy trong địa chỉ đó, số nguyên đầu tiên của chúng tôi sẽ được lưu trữ sau đó khi tôi trở thành 1 nên 1000 + 1 được hiểu bên trong là (1000) +1 * 4 nếu tôi giả sử kích thước của số nguyên là 4 byte và nó sẽ bằng 1004, vì vậy số nguyên tiếp theo sẽ được lưu trữ trong vị trí 1004. Và điều này sẽ tiếp tục theo cách này, các địa chỉ như 1000, 1004, 1008, v.v. Chúng tôi không sử dụng ký hiệu và trước ptr + i vì ptr đã cho chúng tôi địa chỉ khi chúng tôi viết ptr, đơn giản là một con trỏ và nó chứa địa chỉ chứ không phải giá trị, vì vậy không có yêu cầu đặt ký hiệu và trước nó, và khái niệm này nên rõ ràng.

Ở đây trong vòng lặp này, chúng ta chỉ thực hiện một việc là in tất cả các số nguyên trên màn hình; rõ ràng là chúng ta đang sử dụng ptr + i, nhưng ở đây, trong trường hợp này, chúng ta đang bỏ tham chiếu đến nó vì ptr + i đại diện cho một địa chỉ, vì vậy chúng ta cần tham khảo nó. Nếu tôi bằng 0, nó sẽ là 1000 vì chúng ta giả sử địa chỉ đầu tiên sẽ là 1000, vì vậy chúng ta đang tham chiếu đến nó; chúng ta sẽ nhận được số nguyên đầu tiên sau đó i bằng 1, và nó sẽ trở thành 1001 nhưng được hiểu là 1004 nếu kích thước của số nguyên là 4. Một lần nữa. Chúng tôi đang tham khảo nó, vì vậy nó sẽ cung cấp cho chúng tôi 2NSsố nguyên. Bằng cách này, mọi thứ đều hoạt động.

Vì vậy, về cơ bản đây là một chương trình đơn giản yêu cầu người dùng nhập n số nguyên và sau đó chúng tôi chỉ hiển thị các số nguyên đó trên màn hình. Sau khi thực hiện chương trình, điều này sẽ hiển thị.

Đầu tiên, chúng tôi yêu cầu người dùng nhập số lượng nguyên, sau đó người dùng nhập các số nguyên và chúng tôi chỉ hiển thị chúng trên màn hình.

Phần kết luận:

Không có gì sai trong chương trình trên miễn là chúng ta tiếp tục nó trong một thời gian rất dài ở đây, chúng ta đang mượn bộ nhớ từ heap, nhưng chúng ta sẽ không bao giờ trả lại bộ nhớ trở lại heap. Nó chỉ xảy ra trong trường hợp chương trình / ứng dụng có để chạy trong một thời gian dài như 24 giờ. Họ sẽ gọi lại hàm malloc, và một lần nữa điều đó có nghĩa là mỗi lần họ mượn bộ nhớ từ heap và không bao giờ quay trở lại, đây là một chương trình tồi, vì vậy chúng ta nên ghi trống (địa chỉ của bộ nhớ sẽ được giải phóng) trước khi trả về. Vì vậy, bất cứ khi nào sử dụng malloc miễn phí là quan trọng. Vì vậy, bằng cách sử dụng malloc, chúng tôi đã bảo tồn bộ nhớ và malloc phân bổ bộ nhớ lớn như bạn yêu cầu.

Chúc bạn phân bổ bộ nhớ động vui vẻ!