2016-05-03 13 views
5

bên trong một định nghĩa như thế nàyĐịa chỉ của một mảng được khai báo bên trong một cấu trúc mới

typedef struct 
{ 
    myType array[N]; 
} myStruct; 

myStruct obj; 

thể tôi luôn luôn giả thiết rằng ([sửa] giả đúc thích hợp sẽ xảy ra mà không phải là trọng tâm của câu hỏi ở đây [/ chỉnh sửa ])

(&obj == &obj.array[0]) 

sẽ trả về TRUE hoặc tôi nên lo lắng về trình biên dịch giới thiệu thêm đệm để chứa các điều kiện căn chỉnh myType? Về lý thuyết, điều này không nên xảy ra vì cấu trúc có một trường đơn lẻ nhưng tôi không hoàn toàn chắc chắn về điều này.

+7

C và C++ là ** ngôn ngữ ** khác nhau và so sánh mang lại các loại khác nhau trong cả hai. Nhưng không ai trong số họ có một hằng số chuẩn hoặc macro có tên 'TRUE'. – Olaf

+0

Tôi khuyên bạn nên sử dụng 'obj.array' nếu bạn muốn tham chiếu đến mảng và' obj.array [0] 'nếu bạn muốn tham chiếu đến phần tử đầu tiên trong mảng. Sử dụng 'obj' để truy cập mảng sẽ khó hiểu hơn đối với người ngoài. – jboockmann

+4

Không chắc chắn về C nhưng trong C++ có thể không có đệm trước biến thành viên đầu tiên. – NathanOliver

Trả lời

6

Với dàn diễn viên phù hợp, điều này sẽ luôn trả về giá trị đúng.

Từ phần 6.7.2.1 của C standard:

13. Trong vòng một đối tượng cấu trúc, các thành viên phi bit trường và các đơn vị trong đó cắn-lĩnh vực cư trú có địa chỉ làm tăng trong thứ tự mà chúng được khai báo. Một con trỏ đến một đối tượng đối tượng, được chuyển đổi phù hợp, trỏ đến thành viên ban đầu (hoặc nếu thành viên đó là trường bit, sau đó đến đơn vị trong đó cư trú) và ngược lại. Có thể có phần đệm chưa đặt tên trong một đối tượng cấu trúc , nhưng không phải lúc ban đầu.

+0

Cảm ơn bạn đã xác nhận thông qua tiêu chuẩn C. Và cảm ơn cũng có những người khác đã nhận xét (những người đọc nó một cách cẩn thận, ít nhất :-) – ad3angel1s

6

Theo C hiện ++ tiêu chuẩn dự thảo [class.mem] §20 (N4527), nhấn mạnh thêm:

Nếu một đối tượng lớp tiêu chuẩn bố trí có bất kỳ thành viên dữ liệu không tĩnh, địa chỉ của nó cũng giống như địa chỉ của mình thành viên dữ liệu không tĩnh đầu tiên. Nếu không, địa chỉ của nó giống như địa chỉ của lớp cơ sở đầu tiên của nó là subobject (nếu có). [Lưu ý: Do đó, có thể có phần đệm không được đặt tên trong một đối tượng cấu trúc tiêu chuẩn , nhưng không ở đầu của nó, khi cần thiết để đạt được căn chỉnh thích hợp. - lưu ý cuối]

Cho dù myStruct là bố cục chuẩn, phụ thuộc vào việc myType là bố cục chuẩn hay không. Nếu có, thì những gì bạn đang yêu cầu được đảm bảo bởi tiêu chuẩn C++.

Lưu ý rằng &obj&obj.array[0] có các loại con trỏ không liên quan, vì vậy biểu thức không hợp pháp trong C++.

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