2012-08-28 28 views
5

Trong c99, sự hiểu biết của tôi là so sánh hai con trỏ không trỏ trong cùng một kết quả tổng hợp trong hành vi không xác định. Cho một tổng hợp A, một con trỏ p_good được biết là chỉ trong A, và một con trỏ p_unknown có thể hoặc không thể trỏ trong A, có thể xây dựng một thử nghiệm di động với hành vi đã xác định xem có an toàn để so sánh p_good hay không p_unknown?C99: Có thể xác định chính xác nếu hai con trỏ trỏ vào cùng một tổng hợp không?

Rõ ràng, kiểm tra này không thể tự mình rơi vào các hạn chế về so sánh con trỏ.

Tôi nghi ngờ câu trả lời là 'không', nhưng tôi rất sẵn lòng được hiển thị theo cách khác.

+1

Bạn có ý nghĩa gì với 'tổng hợp'? Và bạn đang cố gắng đạt được điều gì? –

+0

Bạn có con trỏ đến 'A' không? Hay chỉ hai con trỏ trỏ vào 'A'? –

+0

Tôi nghĩ rằng "không", nhưng vẫn còn, một cái gì đó như "x> = y && x

Trả lời

5

Bạn nhận xét:

Một cách khác để đóng khung câu hỏi sẽ được như thế này: Căn cứ vào định nghĩa của một tổng hợp 'A' và một con trỏ p, là nó có thể trả lời câu hỏi 'không p điểm trong vòng A 'mà không vi phạm quy tắc về kiểm tra bất bình đẳng của con trỏ đến các tập hợp khác nhau

Cách duy nhất tôi có thể giải thích điều này có nghĩa là bạn có đối tượng kiểu Aggregate type hoặc con trỏ đến một. Thì câu trả lời rất đơn giản:

Pseudo-code:

bool p_in_A = false; 
for (each element in Aggregate A) 
    if (&element == p) 
     p_in_A = true; 

Không có cách nào để nói cho dù một con trỏ đi lạc thuộc về một đối tượng tổng hợp chưa biết (hoặc điểm "giữa" các yếu tố trong một tổng hợp).

+0

Vâng, điều này có ý nghĩa. Tôi đồng ý không có cách nào để làm điều đó trong trường hợp của một tổng hợp chưa biết, nhưng trong trường hợp của tôi tôi biết đủ về A để sử dụng kiểm tra bình đẳng lặp lại. Điều thú vị là tránh UB yêu cầu thuật toán O (sizeof (A)). – acm

+1

@acm, cho một agreagate của loại không biết nơi bạn chỉ biết con trỏ cơ sở và kích thước bạn sẽ phải làm tất cả điều này trên một cơ sở byte bằng cách đúc con trỏ của bạn để 'unsigned char *'. –

+0

@ JensGustedt Trong trường hợp động cơ, tôi biết loại A, và nó xảy ra là char [], vì vậy nó sẽ hoạt động mà không cần truyền. – acm

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