Trong C, không cần phải chuyển void *
sang bất kỳ loại con trỏ nào khác, nó luôn được quảng bá một cách an toàn. Tuy nhiên, trong C ++, đây không phải là trường hợp. Ví dụ,
int *a = malloc(sizeof(int));
hoạt động trong C, nhưng không hoạt động trong C ++. (Lưu ý: Tôi biết rằng bạn không nên sử dụng malloc
trong C ++, hoặc cho rằng vấn đề new
, và thay vào đó nên thích con trỏ thông minh và / hoặc STL, điều này được yêu cầu đơn thuần vì tò mò) Tại sao chuẩn C ++ không cho phép diễn viên tiềm ẩn này, trong khi tiêu chuẩn C làm gì?
sizeof(*a)
thay thế.
malloc
không thể trả về một con trỏ cho loại được phân bổ. new
là C ++ không trả về một con trỏ tới kiểu được phân bổ, do đó, mã C ++ được viết đúng sẽ không bao giờ có bất kỳ void *
s nào để truyền.
void
, C thì không . Khi từ khóa / ý tưởng đó được thêm vào C, họ đã thay đổi nó cho phù hợp với nhu cầu của C. Đó là một thời gian ngắn sau khi loại con trỏ bắt đầu được kiểm tra ở tất cả . Xem nếu bạn có thể tìm thấy cuốn sách nhỏ mô tả K & R C trực tuyến hoặc bản sao cổ điển của văn bản lập trình C như C Primer của Tập đoàn Waite . ANSI C đã có đầy đủ, các tính năng được nhập hoặc lấy cảm hứng từ C ++ và K & R C đơn giản hơn nhiều. Vì vậy, chính xác hơn là C ++ đã mở rộng C như nó tồn tại vào thời điểm đó, và C mà bạn biết đã bị tước khỏi C ++.
long *a = malloc(sizeof(int));
Rất tiếc, ai đó quên chỉ thay đổi một loại!