Chào các bạn! Hôm nay mình muốn thảo luận với các bạn về một vấn đề liên quan đến toán tử sizeof trong ngôn ngữ lập trình C++. Đó là làm thế nào để tính kích thước của một phần tử mảng cụ thể mà chúng ta đã cấp phát.
Vấn đề với hàm sizeof
Khi chúng ta sử dụng hàm sizeof để tính kích thước của một mảng, chúng ta thường nhận được kết quả là kích thước của một phần tử trong mảng đó. Ví dụ, khi chúng ta cấp phát một mảng q với kích thước 100, hàm sizeof sẽ trả về 4 byte (với kiểu dữ liệu float) thay vì 400 byte mà chúng ta mong muốn.
Vấn đề với con trỏ
Điều tương tự cũng xảy ra khi chúng ta sử dụng toán tử sizeof với một con trỏ. Khi chúng ta kiểm tra kích thước của mảng a[100] sử dụng sizeof, kết quả là 400 byte. Nhưng khi chúng ta kiểm tra kích thước của con trỏ p, kết quả lại chỉ là 4 byte. Vậy tại sao lại như vậy?
Giải thích
Lý do là vì khi chúng ta gán một con trỏ như p = a, hàm sizeof sẽ trả về kích thước của kiểu dữ liệu của con trỏ, chứ không phải kích thước của mảng. Điều này khiến cho việc sử dụng sizeof với con trỏ trở nên không hiệu quả.
Cách khắc phục
Sau khi tìm hiểu, mình đã tìm thấy hai cách để kiểm tra việc cấp phát bộ nhớ trong C++ có lỗi hay không:
Cách 1: Sử dụng toán tử new
Ví dụ:
double *pd;
int n;
cout << "Số phần tử n: ";
cin >> n;
pd = new double[n];
if (pd == NULL) {
cout << "Lỗi" << endl;
exit(0);
}
Cách 2: Sử dụng _new_handler
Ví dụ:
void kiem_tra_new(void) {
cout << "Lỗi";
exit(0);
}
_new_handler = kiem_tra_new;
int n;
cout << "Số phần tử n: ";
cin >> n;
pd = new double[n];
Kết luận
Sau một thời gian nghiên cứu, mình không tìm thấy cách nào khác phục sự hạn chế của toán tử sizeof khi sử dụng với mảng. Nếu bạn có bất kỳ ý kiến hay giải pháp nào khác, rất mong nhận được sự chia sẻ của bạn.
Hình ảnh minh họa