Thứ Năm, 1 Tháng Mười Hai 2022
Trang chủLập trìnhLập trình C/C++Cấp phát bộ trong động C/C++ - malloc, realloc, calloc, new

Cấp phát bộ trong động C/C++ – malloc, realloc, calloc, new

Nói đến con trỏ không thể không nhắc tới cấp phát bộ nhớ động cho biến con trỏ trong ngôn ngữ C/C++. Trong bài viết này, chúng ta sẽ cùng đi giải quyết vấn đề cấp phát bộ nhớ động sử dụng malloc()calloc() và realloc() trong C. Và new trong C++ để cấp phát bộ nhớ.

XEM THÊM: Giải phóng bộ nhớ động trong C/C++ – Hàm free(), delete

Cấp phát bộ nhớ trong C

Để sử dụng các hàm malloc()calloc() và realloc() ta cần khai báo thư viện stdlib.h

Hàm malloc()

Cú pháp:

 ptr = (cast_type *) malloc (byte_size);  

Trong đó:

  • cast_type: kiểu dữ liệu con trỏ
  • malloc: Gọi hàm malloc để cáp phát bộ nhớ cho con trỏ ptr
  • byte_size: Số byte cấp phát

Ví dụ sử dụng

Mình sẽ có ví dụ mình họa như sau:

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

int main(){
	int *a;//Khai bao con trỏ a
	
	int n;
	printf("Nhap so phan tu: ");
	scanf("%d", &n);
	
	for(int i = 0; i<n; i++){
		printf("a[%d] = ", i);
		scanf("%d", &a[i]);
	}
	
	printf("\n\nMang vua nhap:  ");
	for(int i = 0; i<n; i++){
		printf("%d ", a[i]);
	}
}

Bây giờ bạn hãy chạy thử chương trình này, chắc chắn khi nhập ngay phần tử đầu tiên thì chương trình đã gặp lỗi. Bởi vì con trỏ a chúng ta vẫn chưa cấp phát bộ nhớ cho nó, vậy ta sẽ sử dụng hàm malloc để cấp phát bộ nhớ như sau:

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

int main(){
	int *a;//Khai bao con tr? a
	
	int n;
	printf("Nhap so phan tu: ");
	scanf("%d", &n);
	
	a = (int *) malloc(n * sizeof(int)); //Cấp phát bộ nhớ cho con trỏ a với hàm malloc
/*
// (int *) kiểu dữ liệu int*
// malloc(n * sizeof(int)) - sizeof(int) dể lấy kích thước kiểu dữ liệu int (int có kích thước 4 byte), nhân n để cấp phát số byte đủ cho n phần tử con trỏ a
*/
	
	for(int i = 0; i<n; i++){
		printf("a[%d] = ", i);
		scanf("%d", &a[i]);
	}
	
	printf("\n\nMang vua nhap:  ");
	for(int i = 0; i<n; i++){
		printf("%d ", a[i]);
	}
}

Và đây là kết quả khi chạy chương trình. Sau khi đã cấp phát bộ nhớ, chương trình đã có thể chạy một cách bình thưởng rồi.

Cấp phát bộ nhớ trong C

Hàm calloc()

Tương

Cú pháp:

 ptr = (cast_type *) calloc(n, size);  

Trong đó:

  • (cast_type *): Kiểu dữ liệu con trỏ
  • calloc: Gọi hàm calloc để cấp phát bộ nhớ
  • n: Số lượng phần tử cần cấp phát
  • size: Kích thước của kiểu dữ liệu(Kích thước 1 phần tử)

Ví dụ sử dụng

Tương tự như hàm malloc, xem code mẫu.

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

int main(){
	int *a; //Khai báo con trỏ a
	
	int n;
	printf("Nhap so phan tu: ");
	scanf("%d", &n);
	
	a = (int *) calloc(n, sizeof(int)); //Cấp phát bộ nhớ với hàm calloc

	for(int i = 0; i<n; i++){
		printf("a[%d] = ", i);
		scanf("%d", &a[i]);
	}
	
	printf("\n\nMang vua nhap:  ");
	for(int i = 0; i<n; i++){
		printf("%d ", a[i]);
	}
}

Hàm realloc()

Hàm realloc() sử dụng để cấp phát lại, hay cấp phát thêm bộ nhớ cho con trỏ mà đã được cấp phát bộ nhớ với hàm calloc hoặc malloc trước đó.

Ví dụ sử dụng.

Mình sẽ có một ví dụ như sau: Ban đầu cấp phát bộ nhớ cho con trỏ str kích thước là 14 ký tự với hàm malloc để lưu chuỗi TUICOCACH.COM, sau đó mình sẽ mở rộng bộ nhớ thành 100 ký tự bằng hàm realloc rồi nối thêm chuỗi – BLOG TU HOC LAP TRINH vào chuỗi ban đầu.

Code mẫu

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

int main()
{
   char *str;

   /* lan cap phat bo nho ban bau */
   str = (char *) malloc(14); //Cấp phát bộ nhớ gồm 14 ký tự(vì char có kích thước 1 byte nên ta kg cần nhân)
   strcpy(str, "TUICOCACH.COM");
   printf("Chuoi ban dau: %s", str);

   /* tai cap phat lai bo nho */
   str = (char *) realloc(str, 100); //Cấp phát lại bộ nhớ thành 100byte
   strcat(str, " - BLOG TU HOC LAP TRINH");
   printf("\nChuoi sau khi cap them bo nho va noi chuoi: %s", str);

   free(str);
   
   return(0);
}

Kết quả khi chạy chương trình

Cấp phát bộ nhớ với hàm realloc

Cấp phát bộ nhớ trong C++

Trong C++, thay vì hàm malloc()calloc() và realloc()  thì ta có new để cấp phát bộ nhớ.

Cú pháp

 ptr = new cast_type(size);  

Trong đó:

  • cast_type: Kiểu dữ liệu
  • size: Số ô nhớ

Ví dụ sử dụng

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    int n;
    cout << "nhap n: ";
    cin >> n;
    int * a;
    
// Cấp phát vùng nhớ với số lượng số int là n
    a = new int[n];

    cout << "Nhap phan tu\n" << endl;
    for (int i = 0; i < n; ++i)
    {
        cin >> *(a + i);
    }

    cout << "\nDay so vua nhap:\n" << endl;
    for (int i = 0; i < n; ++i) {
        cout << *(a + i)<<" ";
    }

    return 0;
}

Cảm ơn bạn đã đọc hết bài viết!! Đã cấp phát bộ nhớ thì sẽ cần giải phóng bộ nhớ. Bài viết tiếp theo Giải phóng bộ nhớ động trong C/C++ – Hàm free(), delete.

[XEM TẤT CẢ BÀI VIẾT CHỦ ĐỀ C/C++ TẠI ĐÂY]

0 0 Phiếu bình chọn
Xếp hạng bài viết
BÀI VIẾT LIÊN QUAN
Đăng ký nhận thông báo
Thông báo email khi
guest
0 Bình luận
Không thể gửi email
Phản hồi nội tuyến

NÊN ĐỌC THÊM

Bạn muốn tìm kiếm gì?


0
Giáo sư! có thể ném gạch bên dưới nhé!x
()
x