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.
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ớ 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]