2011-12-18 33 views
10

Nói chung, theo tiêu chuẩn C, nó đảm bảo rằng memset() với 0 sẽ không ra các bit đệm trong cấu trúc C?Có đảm bảo rằng bộ nhớ sẽ không ra các bit đệm trong cấu trúc không?

Còn gcc thì sao?

Ví dụ, một cái gì đó như:

struct MyStruct 
{ 
    unsigned char member1; 
    unsigned int member2; 
    char  member3; 
    unsigned char member4; 
    float  member5;  
}; 

struct MyStruct ms; 

memset(&ms, 0, sizeof(struct MyStruct)); 
+0

Bạn có thể hiển thị cho chúng tôi mẫu mã không? – Mysticial

+0

thêm mẫu mã –

+2

Tôi không hiểu điều gì khiến bạn nghi ngờ điều đó. –

Trả lời

15

Có lẽ đáng chú ý là memset không biết gì về cấu trúc của bạn (hoặc mảng, hoặc nguyên thủy, hoặc bất kỳ đoạn bộ nhớ bất cứ điều gì bạn xảy ra để giải phóng nó trên), vì vậy ngay cả khi nó muốn để lại các bit padding còn nguyên vẹn, nó thậm chí sẽ không biết họ đang ở đâu.

11

Vâng, memset viết một giá trị 32 bit vào một khu vực tiếp giáp của ký ức về một thời gian trao bắt đầu từ địa chỉ nhất định. Trong trường hợp của bạn, memset viết khu vực với (giá trị 32 bit) 0.

Vì vậy, nếu bạn làm một memset chiều dài sizeof (your_struct), bạn cần sử dụng tốt:

memset(&ms, 0, sizeof(struct MyStruct)); 
8

Nếu điều đó quan trọng, bạn có thể làm điều gì đó không an toàn và không di động.

Có, cuộc gọi memset sẽ đặt bất kỳ bit đệm (hoặc byte) nào thành 0 - nhưng không đảm bảo bằng ngôn ngữ đặt đối tượng float thành tất cả bit-0 sẽ đặt thành 0.0. Điều tương tự cũng áp dụng cho con trỏ: tất cả bit-zero không được bảo đảm là con trỏ rỗng. (Trong cả hai trường hợp, điều này đúng với hầu hết các lần triển khai.)

Chuẩn ISO C90 hoặc C99 ban đầu thậm chí không đảm bảo rằng tất cả bit-zero là biểu diễn hợp lệ 0 cho các loại nguyên; một trong các Corrigenda sau C99 đã thêm một bảo đảm như vậy (chỉ dành cho các loại số nguyên).

Đối với tính di động, nếu bạn muốn thứ gì đó bằng không, hãy đặt rõ ràng. Bạn cũng có thể tận dụng lợi thế của việc khởi tạo giá trị bằng không cho các đối tượng tĩnh và cho các thành viên bị bỏ qua trong initializers.

Nitpick thuật ngữ: "bit đệm" là một phần của biểu diễn các loại số nguyên (và thường không có loại số nguyên nào trong số đó). Đệm giữa các thành viên cấu trúc là đệm byte.

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