Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Malloc trong ngôn ngữ C là gì?


Hàm cấp phát bộ nhớ thư viện C void *malloc(size_t size) cấp phát bộ nhớ yêu cầu và trả về con trỏ tới nó.

Các hàm cấp phát bộ nhớ

Bộ nhớ cấp phát 2 cách:

Malloc trong ngôn ngữ C là gì?

Cấp phát tại compile time không thể thay đổi khi chạy. Vấn đề thiếu hoặc lãng phí bộ nhớ.

Giải pháp: cấp phát động theo yêu cầu khi chạy.

Hàm thư viện chuẩn cho quản lý bộ nhớ động:

  • malloc()
  • calloc()
  • realloc()
  • free()

Hàm malloc()

Dùng để cấp phát khối bộ nhớ tính bằng byte tại runtime. Trả về con trỏ void trỏ tới địa chỉ cơ sở bộ nhớ cấp phát.

Cú pháp:

void *malloc(kích thước byte)

Ví dụ 1

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

Lưu ý: Trả về NULL nếu bộ nhớ không đủ.

Chương trình ví dụ

Chương trình C minh họa malloc():

#include <stdio.h> 
#include <stdlib.h> 
void main() { 
    int numofele, i; 
    int *p; 
    printf("Nhập số phần tử mảng: "); 
    scanf("%d", &numofele); 
    p = (int*) malloc(numofele * sizeof(int)); 
    for (i = 0; i < numofele; i++) { 
        p[i] = i + 1; 
        printf("Phần tử %d của mảng: %d\n", i, p[i]); 
    } 
}

Kết quả

Nhập số phần tử mảng: 4 
Phần tử 0: 1 
Phần tử 1: 2 
Phần tử 2: 3 
Phần tử 3: 4

Ví dụ 2

Chương trình C hiển thị phần tử dùng malloc, 5 khối đầu rỗng, 5 khối sau có logic:

#include <stdio.h> 
#include <stdlib.h> 
void main() { 
    int numofe, i, sum = 0; 
    int *p; 
    printf("Nhập số phần tử: "); 
    scanf("%d", &numofe); 
    p = (int*) malloc(numofe * sizeof(int)); 
    if (p == NULL) { 
        printf("Bộ nhớ không khả dụng"); 
        exit(0); 
    } 
    printf("Nhập các phần tử:\n"); 
    for (i = 0; i < numofe; i++) { 
        scanf("%d", p + i); 
        sum += *(p + i); 
    } 
    printf("\nTổng các phần tử: %d", sum); 
    free(p); // Giải phóng 2 vị trí bộ nhớ đầu 
    printf("\nHiển thị vị trí bộ nhớ đã xóa:\n"); 
    for (i = 0; i < numofe; i++) { 
        printf("%d\n", p[i]); // Giá trị rác 
    } 
}

Kết quả

Nhập số phần tử: 5 
Nhập phần tử: 12 10 24 45 67 
Tổng các phần tử: 158 
Hiển thị vị trí bộ nhớ đã xóa: 
7804032 0 7799120 0 67