1
Vì sao cách ép kiểu trong C không an toàn và nên sử dụng static_cast trong C++?
2
AnCs8530 đã đăng:

Theo như mình được biết cách ép kiểu trong C là như vầy,

int a = 2;
float c = (float)a;

thì được cho là không an toàn, tại sao lại như vậy và người ta khuyên dùng static_cast thay vì cách ép kiểu như trên, có bạn nào biết không?

thêm bình luận...
0
Khánh Hải40 đã đăng:

Có hai lý do mà mình biết tại sao nên sử dụng static_cast trong C++ hơn là ép kiểu truyền thống trong C.

static_cast tự động kiểm tra xem kiểu dữ liệu có tương thích hay không, trong khi C vẫn cho phép ép kiểu mặc dù hai kiểu dữ liệu không tương thích.

Chuyện gì xảy ra nếu hai kiểu dữ liệu không tương thích:

  • static_cast sẽ thông báo lỗi ngay khi bạn đang lập trình, điều này cho phép bạn sửa lại mã nguồn trước khi chạy chương trình.
  • Ép kiểu trong C mặc dù không thông báo lỗi khi bạn đang lập trình, nhưng sẽ quăng lỗi ngay khi bạn chạy chương trình, cụ thể là lỗi Stack was corrupted.

Ví dụ ép kiểu trong C:

char str = 'a';
int *pointer = (int *)&str; // Ép kiểu trong C
*pointer = 10; // Lỗi runtime: Stack was corrupted

Ví dụ sử dụng static_cast trong C++:

char str = 'a';
int *pointer = static_cast<int *>(&str); // Lỗi compiletime: invalid type conversion
*pointer = 10;

Tại sao lại xảy ra hai lỗi trên? Bởi vì kiểu dữ liệu int (4 bytes) và char (1 bytes) không tương thích, khi bạn dùng con trỏ pointer trỏ tới địa chỉ của str, tức là con trỏ đang nắm giữ vùng nhớ của str, mà vùng nhớ của str chỉ có 1 bytes, cho nên khi bạn gán pointer bằng một giá trị số nguyên 4 bytes (cụ thể ở ví dụ trên là 10), nó không đủ vùng nhớ để lưu trữ số nguyên này, dẫn đến lỗi.

Theo cách xử lý lỗi mình đã giải thích ở trên, thì static_cast được xem là an toàn hơn.

Đối với các chương trình lớn, phức tạp, việc khai báo từ khóa một cách rõ ràng như ..._cast khi ép kiểu trong C++ giúp bạn dễ quản lý và tìm chúng trong mã nguồn của bạn hơn là ép kiểu truyền thống trong C.

đã bổ sung 5.9 năm trước bởi
thêm bình luận...
Bạn đang thắc mắc? Ghi câu hỏi của bạn và đăng ở chế độ cộng đồng (?)