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
Trả lời
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.
Tôi thích điều này, cảm ơn! – themaestro
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.
- 1. C liên kết kích thước cấu trúc
- 2. Kích thước của cấu trúc trong Go
- 3. Kích thước của cấu trúc C# này là gì?
- 4. C# gọi hàm C trả về cấu trúc với mảng char có kích thước cố định
- 5. Tại sao kích thước 16 byte được đề nghị cho cấu trúc trong C#?
- 6. Con trỏ C++ có kích thước bit cụ thể
- 7. kích thước bộ nhớ của cấu trúc dữ liệu Python
- 8. Căn chỉnh cấu trúc trong Visual C++
- 9. Mảng bên trong cấu trúc trong C
- 10. Django 1,4 dự án mới cấu trúc thư mục lực lượng tiền tố dự án?
- 11. Một cách để tìm kích thước và vị trí đệm trong cấu trúc?
- 12. Có bất kỳ giới hạn kích thước nào đối với cấu trúc C không?
- 13. clang: Lực lượng vòng lặp unroll cho vòng lặp cụ thể
- 14. C/C++ nhận được kích thước struct
- 15. kích thước của struct trong C
- 16. Tại sao cấu trúc có thể lưu trữ kích thước của riêng nó?
- 17. MFMailComposeViewController Lực lượng thực tế kích thước trên tập tin đính kèm hình ảnh
- 18. Sao chép cấu trúc vào cấu trúc trong C
- 19. Cấu trúc Constructor trong C++?
- 20. Tôi có thể nhận được kích thước của một trường struct w/o tạo một thể hiện của cấu trúc?
- 21. Làm cách nào để thay đổi kích thước ảnh thành một kích thước tệp cụ thể?
- 22. tạo tệp có kích thước cụ thể trong python
- 23. Cấu trúc tĩnh trong C++
- 24. C++ Cấu trúc riêng
- 25. Làm cách nào để ước tính kích thước của cấu trúc dữ liệu trong scala?
- 26. Không thể Git-thêm với lực lượng
- 27. Sử dụng cấu trúc C trong Java
- 28. Cách nhận thời lượng, kích thước và kích thước video trong PHP?
- 29. Cấu trúc rỗng trong C và cấu trúc rỗng trong C++
- 30. Tôi có thể 'mở rộng' một cấu trúc trong C?
Lý do là gì? Có thể có một cách khác để giải quyết vấn đề. –
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
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