Giả sử tôi có cấu trúc sau:Việc khởi tạo các cấu trúc có đảm bảo xóa các vùng đệm không bằng không?
typedef struct
{
unsigned field1 :1;
unsigned field2 :1;
unsigned field3 :1;
} mytype;
3 bit đầu tiên sẽ có thể sử dụng nhưng sizeof(mytype)
sẽ trở lại 4
có nghĩa là 29 bit của padding. Câu hỏi của tôi là, được các bit đệm đảm bảo theo tiêu chuẩn là không khởi tạo bởi tuyên bố:
mytype testfields = {0};
hay:
mytype myfields = {1, 1, 1};
như vậy mà nó an toàn để thực hiện các memcmp()
sau trên giả định rằng bit 4..29 sẽ bằng không và do đó sẽ không ảnh hưởng đến so sánh:
if (memcmp(&myfields, &testfields, sizeof(myfields)) == 0)
printf("Fields have no bits set\n");
else
printf("Fields have bits set\n");
+1, thú vị Tôi đã không nhận thức được sự thay đổi này. – ouah
Tôi nghĩ bạn nên thêm phần đầu của đoạn C11 * Nếu một đối tượng có thời lượng lưu trữ tự động không được khởi tạo một cách rõ ràng, giá trị của nó không xác định. Nếu một đối tượng có thời gian lưu trữ tĩnh hoặc luồng không được khởi tạo một cách rõ ràng, thì: * Điều này không đảm bảo phần đệm trong 'mytype testfields = {0};' được đặt thành '0'. – ouah
@ouah, trên thực tế có vẻ như là một lỗ hổng, bạn nói đúng. Tôi không nghĩ rằng nó là dự định, vì vậy tôi sẽ giải thích thêm một chút. Điểm tốt. –