2013-01-24 26 views
19

Các chuẩn C++ [giây 5,7] nói:Con trỏ "một-qua-the-end" của một kiểu mảng không phải là một khái niệm hợp lệ trong C++?

Nếu cả hai toán hạng trỏ và điểm kết quả đến các yếu tố của đối tượng cùng một mảng, hoặc một quá khứ yếu tố cuối cùng của đối tượng mảng, việc thẩm định có trách nhiệm không tạo ra một tràn; nếu không, hành vi là không xác định.

Vì vậy, tôi có chính xác giả định rằng các con trỏ một-quá-đầu-cuối của các loại khác với mảng không xác định không?

Ví dụ:

int a = 0; 
vector<int> v(&a, (&a)+1); 

Đoạn trên biên dịch và làm việc tốt (với g ++), nhưng nó có giá trị?

+0

Tôi muốn bình luận về việc liệu "con trỏ một-qua-the-end của các loại khác hơn mảng là không xác định?'. ** Con trỏ ** luôn được xác định vì chúng đơn giản là số, địa chỉ. Giá trị ** ** của con trỏ này là không xác định. Bạn không được dereference những con trỏ. Nhưng constructor 'vector' không coi trọng chúng, vì vậy nó ổn. – NIA

+0

Đúng, nhưng không gian địa chỉ không phải là vô hạn. Vì vậy, có một con trỏ đến phần tử cuối cùng trong không gian địa chỉ. Gia tăng con trỏ đó sẽ không có ý nghĩa. –

+7

Con trỏ không chỉ đơn giản là số. Tiêu chuẩn C++ làm cho nó rất rõ ràng rằng bạn không thể sử dụng phép cộng và trừ tùy ý với con trỏ. Đặc biệt, thực hành sử dụng một con trỏ đến một trước khi một mảng để chứa các thuật toán dựa trên 1 gây ra hành vi không xác định. AFAIK có hoặc đã từng là kiến ​​trúc máy tính, nơi tải một giá trị không trỏ tới bộ nhớ hợp lệ vào thanh ghi con trỏ có thể gây ra bẫy. – JoergB

Trả lời

25

Không, nó là hợp pháp. 5.7 (4) - một đoạn trước dấu ngoặc kép của bạn - nói: "Vì mục đích của các toán tử này, một con trỏ tới một đối tượng nonarray hoạt động giống như một con trỏ tới phần tử đầu tiên của một mảng có độ dài một với kiểu đối tượng làm loại phần tử của nó. "

+0

bạn có nghĩa là "hợp lệ", không phải là "hợp pháp", tôi đoán. nếu không nhiều người lập trình có thể phải vào tù. –

+0

Có. 'legal' = "hợp lệ, theo đặc tả ngôn ngữ C++" – JoergB

+0

JoergB: Cảm ơn! Tôi hoàn toàn bỏ lỡ câu đó. –

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