Menu
CoddyTech

Kiểm tra lỗi cấp phát

Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 34 trên 63.

malloc() là một công cụ mạnh mẽ để cấp phát bộ nhớ động, nhưng bạn cần hiểu một thực tế quan trọng: malloc() có thể thất bại. Khi hệ thống hết bộ nhớ khả dụng, malloc() không thể đáp ứng yêu cầu của bạn và trả về NULL thay vì một địa chỉ bộ nhớ hợp lệ.

Điều này có nghĩa là mỗi khi dùng malloc(), bạn phải kiểm tra xem hàm có thành công hay không trước khi sử dụng con trỏ được trả về. Dùng con trỏ NULL sẽ khiến chương trình gặp lỗi phân đoạn và bị dừng.

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Thoát chương trình hoặc xử lý lỗi
}

// Có thể dùng ptr ở đây một cách an toàn
*ptr = 42;

Việc kiểm tra NULL này không phải là tùy chọn, mà rất cần thiết để viết các chương trình C vững chắc. Dù tình trạng cấp phát bộ nhớ thất bại hiếm khi xảy ra trên các hệ thống hiện đại, điều đó vẫn có thể xảy ra, nhất là trong môi trường hạn chế tài nguyên hoặc khi yêu cầu cấp phát lượng bộ nhớ lớn. Code C chuyên nghiệp luôn có các bước kiểm tra này để tránh sự cố và xử lý lỗi một cách phù hợp.

challenge icon

Thử thách

Dễ

Viết một chương trình C minh họa cách xử lý lỗi phù hợp khi dùng malloc() để cấp phát bộ nhớ động. Chương trình cần:

  1. Đọc một số nguyên n từ người dùng, biểu thị số lượng số nguyên cần lưu trữ
  2. Dùng malloc() cùng với sizeof() để cấp phát động bộ nhớ cho một mảng gồm n số nguyên
  3. Kiểm tra việc cấp phát bộ nhớ có thành công hay không bằng cách kiểm tra xem con trỏ trả về có phải là NULL hay không
  4. Nếu cấp phát thất bại, in ra Memory allocation failed! rồi kết thúc chương trình
  5. Nếu cấp phát thành công, in ra Memory allocation successful!
  6. Đọc n giá trị số nguyên từ người dùng và lưu vào mảng đã cấp phát
  7. Tính và in tổng của tất cả các giá trị theo định dạng: Sum: [value]
  8. In tổng số byte đã cấp phát theo định dạng: Bytes allocated: [value]

Nhớ thêm tiêu đề <stdlib.h> để dùng malloc(). Chương trình cần thể hiện thực hành thiết yếu là kiểm tra lỗi cấp phát trước khi sử dụng vùng nhớ đã cấp phát.

Ví dụ, nếu đầu vào là:

4
10 20 30 40

Đầu ra cần là:

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Thử thách này nhấn mạnh tầm quan trọng cốt yếu của lập trình phòng thủ khi làm việc với cấp phát bộ nhớ động, giúp chương trình xử lý ổn thỏa các lỗi cấp phát bộ nhớ tiềm ẩn thay vì bất ngờ gặp sự cố.

Tự làm thử

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Đọc số lượng số nguyên
    int n;
    scanf("%d", &n);
    
    // TODO: Viết code của bạn ở đây
    // Dùng malloc() để cấp phát bộ nhớ cho n số nguyên
    // Kiểm tra việc cấp phát có thành công không
    // Xử lý cả trường hợp thành công và thất bại
    // Đọc và lưu các số nguyên
    // Tính tổng và số byte đã cấp phát
    
    return 0;
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Logic và luồng điều khiển

Tự luyện tập: Trình biên dịch C online