Con trỏ - Bài 8 : Gán con trỏ bằng địa chỉ bộ nhớ xin cấp phát

Các chương trình viết bằng C/C++ chuẩn có thể xin cấp phát bộ nhớ từ hệ điều hành, địa chỉ đầu của vùng nhớ được cấp phát sẽ được trả về thông qua biến con trỏ. Sau khi vùng nhớ sử dụng xong, người lập trình cần phải giải phóng vùng nhớ, để trả về bộ nhớ cho hệ thống.

void main()
{
int n; float *a = NULL; // Khai báo con trỏ a kiểu float*
printf("\nEnter array size: ");
scanf("%d", &n);
if(n < 1)
{
printf("\nInvalid size!"); return;
}
a = (float*)malloc(n * sizeof(float)); // gán đến địa chỉ vùng nhớ xin được cấp phát
if(a == NULL)
{
printf("Memory error!"); return;
}
for(int i = 0; i < n; i++)
{
printf("a[%d] = ", i);
scanf("%f", &a[i]);
}
printf("\nData: ");
for(int i = 0; i < n; i++)
{
printf("%f", a[i]);
// do something here
// Finally freeing memory
}
free(a);
getch();
}

void main()
{
int n; float *a = NULL; // Khai báo con trỏ a kiểu float*
cout << "Enter array size: ";
cin >> n;
if(n < 1)
{
cout << "Invalid size!"; return;
}
a = new float[n]; // gán đến địa chỉ vùng nhớ xin được cấp phát
if(a == NULL)
{
cout << "Memory Error!"; return;
}
for(int i = 0; i < n; i++)
{
cout << "a[" << i << "] = ";
cin >> a[i];
}
cout << "Data: ";
for(int i = 0; i < n; i++)
{
cout << a[i] << " ";
// do something here
// Finally freeing memory
}
delete[]a;
getch();
}
Mã nguồn minh họa việc gán con trỏ bằng 1 vùng nhớ được cấp phát, được viết bằng ngôn ngữ C và C++. Chương trình này chỉ làm 1 việc đơn giản là xin cấp phát 1 mảng n số thực kiểu float, nhập n số thực, xuất ra màn hình và sau cùng giải phóng bộ nhớ. Biến con trỏ a kiểu float* được khai báo, sau đó gán đến địa chỉ vùng nhớ xin được cấp phát. Đối với C++, việc gọi new float[n] nghĩa là xin 1 vùng nhớ liên tục chứa được n số float, thực chất thì vùng nhớ này gồm 4n byte bởi vì mỗi số float có kích thước là 4 byte theo chuẩn IEEE. Đối với C, bởi vì hàm malloc() cần nhận vào 1 tham số quy định số byte được cấp phát và trả về con trỏ kiểu void* nên việc gọi hàm cấp phát có phức tạp hơn. Chỉ thị (float*)malloc(n*sizeof(float)) có nghĩa là xin 1 vùng nhớ có kích thước là n*sizeof(float) = 4n byte, bởi vì địa chỉ vùng nhớ trả về kiểu void* nên phải ép kiểu sang float* mới có thể gán được vào biến con trỏ a có kiểu là float*.

Nhận xét