Có hướng dẫn dứt khoát nào nói rằng chúng ta phải khởi tạo cấu trúc sockaddr_in về 0 vì một lý do cụ thể không?Tại sao memset sockaddr_in là 0
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
Bất cứ khi nào tôi nhìn vào mã thực hoặc ví dụ hoặc sách nó luôn luôn có cấu trúc mã tương tự như sau:
struct sockaddr_in foo;
memset(&foo, 0, sizeof(foo));
foo.sin_port = htons(1025);
foo.sin_family = AF_INET;
inet_pton(AF_INET, "10.0.0.1", &foo.sin_addr);
Tôi hiểu rằng một số nguồn tin nói rằng char sin_zero[8]
thành viên là có cho đệm và nên được đặt thành 0 nhưng tại sao không đánh số còn lại. Đặc biệt là khi chúng được khởi tạo trong hầu hết các trường hợp trong vài dòng khai báo tiếp theo. Ngay cả về thành viên sin_zero, hướng dẫn lập trình beej said it is not mandatory to zero them out anymore. Tôi đã tìm kiếm một lời giải thích nhưng không có gì để điểm được bật lên. Điều này stack overflow question có một số gợi ý khác nhau về khởi tạo chính nó nhưng không giải thích tại sao zeroing là cần thiết.
Đây có phải là thực tiễn kế thừa hoặc có một số lý do thực sự mà tôi bỏ lỡ không? Bất kỳ tài liệu tham khảo được đánh giá cao.
Nó đảm bảo rằng bạn không kết thúc với mã dựa vào giá trị rác. Mã như vậy có thể tạo ra Heisenbugs và các lỗi khác khó gỡ lỗi. –
Hoặc chỉ 'struct sockaddr_in foo = {AF_INET, htons (1025)};' - ngắn hơn và chỉ các thành viên còn lại. – MSalters