2015-04-08 26 views
7

Đoạn mã dưới đây sẽ tạo ra một lỗi, vì không có cách nào mà trình biên dịch có thể biết kích thước mảng trong quá trình biên dịch.Tại sao mã này không tạo ra lỗi khi sử dụng kích thước mảng biến?

int f; 
std::cin >> f; 
int c[f]; 
c[100] = 5; 

Tôi đang biên dịch bằng gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 và nó không chỉ biên dịch, nhưng nó chạy bằng cách nào đó.

Làm thế nào để nó xảy ra?

+0

Xem [Liệu “int size = 10;”? Mang một biểu thức hằng] (http://stackoverflow.com/q/21273829/1708801) cho rất nhiều chi tiết hơn về chủ đề này. –

Trả lời

1

C++ không làm giới hạn mảng kiểm tra. line c[100] = 5; tương đương với *(c + 100) = 5;. Bạn chỉ yêu cầu trình biên dịch ghi vào một vị trí bộ nhớ tại một khoảng bù nhất định từ một vị trí bộ nhớ khác. Nếu bạn nhập bất cứ điều gì dưới 100 vào chương trình của bạn, bạn sẽ ghi đè lên một số dữ liệu trên ngăn xếp. Tùy thuộc vào phần còn lại của mã của bạn, điều này có thể gây tràn ngăn xếp, sự cố "ngẫu nhiên" khi một số dữ liệu quan trọng bị ghi đè hoặc nó có thể hoạt động chính xác (và sau đó bắt đầu gặp sự cố sau này khi thay đổi dường như không liên quan thay đổi bố trí bộ nhớ).

+4

Mô tả của bạn là chính xác, nhưng không thực sự liên quan đến câu hỏi mà thực sự là về việc tại sao dòng 'int c [f]; 'biên dịch khi' f' không phải là một thời gian biên dịch liên tục .. – BoBTFish

+0

tôi đã nhận ra rằng một phần. Tôi chỉ cần thêm nó để đảm bảo rằng tôi đã thực sự tạo ra một mảng ở tất cả. Nhưng tôi nghĩ rằng điều này có thể hữu ích cho những người khác sẽ gặp phải câu hỏi này. – v010dya

Các vấn đề liên quan