2011-10-20 17 views
5

Giả sử tôi có hai con trỏ để gõ T:Hạn chế về khoảng cách giữa các con trỏ của loại nhất định trong C++ là gì?

T* first = ...// whatever 
T* second = ... //whatever else 

Tôi có thể chắc chắn rằng khoảng cách giữa hai con trỏ không bao giờ có thể vượt quá:

((size_t)(-1))/sizeof(T)?

+0

Tôi không nghĩ như vậy, nó phụ thuộc vào cách thức và khi bộ nhớ được cấp phát cho các đối tượng 2 T này – Ankur

+0

Tôi nghĩ đó là sự thật miễn là 'size_t' ít nhất là lớn như con trỏ. Nhưng tôi không chắc chắn nếu 'size_t' được đảm bảo là ít nhất là kích thước của một con trỏ. Ai đó sửa tôi nếu tôi sai. – Mysticial

+0

@ Tâm lý: ý bạn là gì bởi "kích thước con trỏ"? Kích thước của một con trỏ thường là 4 hoặc 8 byte. – jalf

Trả lời

13

Bạn chỉ có thể tính toán khoảng cách giữa hai con trỏ (trừ một con trỏ từ con trỏ khác) nếu cả hai con trỏ trỏ tới các phần tử trong cùng một mảng hoặc đến một phần cuối cùng của cùng một mảng.

Nếu hai con trỏ gặp ràng buộc đó, thì có, giá trị tuyệt đối của hai con trỏ không được vượt quá ((size_t)(-1))/sizeof(T)size_t phải đủ rộng để biểu thị kích thước của bất kỳ đối tượng nào theo byte.

Nếu hai con trỏ không đáp ứng được ràng buộc đó, thì không có sự đảm bảo nào cả.

+0

Tôi không đồng ý với câu trả lời này. Sử dụng 'ptrdiff_t' thì sao? – Nawaz

+5

Với 'T * p', kiểu' p - p' là 'std :: ptrdiff_t'. C++ Standard chỉ rõ rằng thao tác trừ con trỏ có thể tràn, cho ra hành vi không xác định (C++ 11 5.7/6). –

+0

+1, khi con trỏ không đáp ứng những hạn chế đó, hành vi không xác định. –

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