2012-01-02 43 views
6

Vì nhiều lý do, tôi có một số cấu trúc tôi muốn ép buộc phải có kích thước cụ thể (trong trường hợp này là 64 byte và 512 byte). Tuy nhiên, cả hai đều thấp hơn một chút so với kích thước tôi muốn chúng. Có anyway cho tôi để nói với trình biên dịch để đặt chúng vào các kích thước cụ thể và pad với số không, hoặc tôi sẽ là tốt nhất off chỉ tuyên bố một mảng bên trong cấu trúc tạo nên không gian dư thừa để nó căn chỉnh trên kích thước tôi muốn?Lực lượng cụ thể Kích thước cấu trúc trong C

+5

Lý do là gì? Có thể có một cách khác để giải quyết vấn đề. –

+0

sử dụng các công đoàn với một loạt các ký tự xuất hiện trong đầu ... – amit

+0

Bạn có thể thử loại hack nào đó với gói '#pragma', nhưng tôi không biết điều này sẽ hữu ích như thế nào. – Polynomial

Trả lời

17

Bạn có thể sử dụng một công đoàn.

struct mystruct_s { 
    ... /* who knows how long */ 
}; 

typedef union { 
    struct mystruct_s s; 
    unsigned char padding[512]; 
} mystruct; 

Điều này sẽ đảm bảo công đoàn từ 512 byte trở lên. Sau đó, bạn có thể đảm bảo rằng nó không quá 512 byte bằng cách sử dụng xác nhận tĩnh ở đâu đó trong mã của bạn:

/* Causes a compiler error if sizeof(mystruct) != 512 */ 
char array[sizeof(mystruct) != 512 ? -1 : 1]; 

Nếu bạn đang sử dụng C11, có cách tốt hơn để thực hiện việc này. Tôi không biết bất kỳ ai sử dụng C11. Tiêu chuẩn được xuất bản một vài tuần trước.

_Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes"); 

Lưu ý rằng cách duy nhất để pad với zero là để đưa zero có tay (calloc hoặc memset). Trình biên dịch bỏ qua các byte đệm.

+0

Tôi thích điều này, cảm ơn! – themaestro

0

Tôi không nghĩ rằng có bất kỳ cách nào để tự động hóa điều này, ít nhất là trong gcc mà trình biên dịch tôi sử dụng. Bạn phải pad các cấu trúc của bạn.

Hãy cẩn thận về automatic alignment các biến trong cấu trúc của bạn. Ví dụ: ví dụ về cấu trúc { char a; int b; }

không mất 5 byte, nhưng 8.

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