2013-04-30 29 views
17

Không c99/c++03 đảm bảo rằng &a+1 > &a luôn đúng không?Liệu "& a + 1> & a" có gây ra hành vi không xác định

ví dụ, có một (c-like) std::copy, và

int a = 0 ; 
int b[9] ; 
std__copy(&a , &a+1 , b) ; 

Điều này luôn làm việc?

+0

có thể giống như http://stackoverflow.com/questions/16233868/pointer-comparisons-with-one-past-the-last-element-of-an-array-object – MOHAMED

+0

Có, mặc dù câu trả lời @ MOHAMED là tài liệu tham khảo cho các cuộc đàm phán về một mảng, đó là nguyên tắc tương tự cho một đối tượng đơn giản. –

+1

@MOHAMED, không có điều đó không giống nhau. Không có câu hỏi cho trường hợp của một mảng, nhưng đối với một biến mảng không phải có từ ngữ đặc biệt. – AProgrammer

Trả lời

17

Vâng, C99 có từ ngữ đặc biệt để nói rằng khi làm việc với các địa chỉ, bất kỳ đối tượng nhất định a sẽ đóng vai trò như một mảng của 1 item, vì vậy mà &a+1 là hợp lệ (§6.5.6/7):

Với mục đích của các toán tử này, một con trỏ tới một đối tượng không phải là một phần tử của một mảng hoạt động giống như một con trỏ đến phần tử đầu tiên của một mảng có độ dài một với loại phần tử là kiểu phần tử của nó.

Mặc dù số phần khác (§6.3.6), C90 đưa ra yêu cầu tương tự.

C++ có cùng yêu cầu trong §5.7/4 (cùng số phần trong cả C++ 03 và C++ 11). Trong C++, bạn có thể so sánh địa chỉ của các đối tượng tùy ý (cùng loại) bằng cách sử dụng std::less, ngay cả khi được xây dựng trong nhà điều hành < sẽ không mang lại kết quả có ý nghĩa (ví dụ: hai đối tượng không phải là phần của cùng một mảng) §20.8.5/7):

đối với mẫu greater, less, greater_equal, và less_equal, các chuyên ngành cho bất kỳ loại con trỏ mang lại một trật tự tổng, ngay cả khi các nhà khai thác built-in <,>, < =, > = không.

Cũng lưu ý rằng mặc dù bạn có thể hình thành những địa chỉ này, và có thể so sánh chúng với các địa chỉ của đối tượng, bạn không thể dereference những gợi ý (tốt, trình biên dịch có thể sẽ không dừng lại bạn nếu bạn cố gắng, nhưng kết quả sẽ là hành vi không xác định).

+0

Thú vị, tôi không bao giờ biết 'std :: less' làm việc để so sánh các địa chỉ tùy ý. Tiêu chuẩn bảo đảm như thế nào? – chris

+0

@chris: Xem câu trả lời đã chỉnh sửa. –

+0

Tôi hiểu, cảm ơn :) – chris

3

Có, điều đó được đảm bảo trong C++ (không biết về C). Các chi tiết cụ thể là một biến kiểu T tương đương với một mảng của một phần tử duy nhất cùng loại và bạn luôn có thể có được một con trỏ vượt quá phần cuối của một mảng.

+0

nếu nó có cùng prinicipe của mảng đối tượng bạn phải đề cập đến trong câu trả lời rằng con trỏ deferencing của '& a + 1' bị cấm – MOHAMED

+0

@MOHAMED: tốt, OP không dereference nó, vì vậy nó không phải là rất có liên quan đến câu trả lời hoặc :) – jalf

+0

Tôi biết Chỉ cần để làm cho anh ta cẩn thận hơn khi sử dụng hành vi như vậy :-) – MOHAMED