Trong ngôn ngữ C, con trỏ void được chuyển đổi ngầm (implicitly) sang kiểu con trỏ đối tượng. Hàm malloc() trả về void* theo chuẩn C89. Trong các phiên bản C cũ hơn, malloc() trả về char*. Trong C++, mặc định malloc() trả về giá trị int (sai, thực tế malloc trả về void* nhưng C++ không cho phép chuyển ngầm void* sang kiểu con trỏ khác). Do đó, con trỏ phải được chuyển đổi tường minh (explicit casting) sang con trỏ đối tượng.
Cú pháp cấp phát bộ nhớ trong C:
pointer_name = malloc(size);
Ví dụ malloc() trong C:
Ví dụ
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 4, i, *p, s = 0;
p = malloc(n * sizeof(int));
if (p == NULL) {
printf("\nLỗi! Không cấp phát được bộ nhớ.");
exit(0);
}
printf("\nNhập phần tử mảng: ");
for (i = 0; i < n; ++i) {
scanf("%d", p + i);
s += *(p + i);
}
printf("\nTổng: %d", s);
return 0;
}
Kết quả
Nhập phần tử mảng: 2 28 12 32 Tổng: 74
Trong ví dụ C trên, nếu ép kiểu tường minh thì không báo lỗi.
Cú pháp cấp phát bộ nhớ trong C++:
pointer_name = (cast-type*) malloc(size);
Ví dụ malloc() trong C++:
Ví dụ
#include <iostream>
using namespace std;
int main() {
int n = 4, i, *p, s = 0;
p = (int*)malloc(n * sizeof(int));
if (p == NULL) {
cout << "\nLỗi! Không cấp phát được bộ nhớ.";
exit(0);
}
cout << "\nNhập phần tử mảng: ";
for (i = 0; i < n; ++i) {
cin >> (p + i);
s += *(p + i);
}
cout << "\nTổng: " << s;
return 0;
}
Kết quả
Nhập phần tử mảng: 28 65 3 8 Tổng: 104
Trong ví dụ C++ trên, nếu không ép kiểu tường minh, chương trình báo lỗi:
error: invalid conversion from 'void*' to 'int*' [-fpermissive] p = malloc(n * sizeof(int));