Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tại sao C++ yêu cầu ép kiểu cho malloc() nhưng C không?


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));