2014-07-10 2 views
7

특별한 이유 때문에 sockaddr_in 구조체를 0으로 초기화해야한다는 확실한 가이드가 있습니까?memset sockaddr_in이 0으로 설정되는 이유

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); 

내가 어떤 소스가 char sin_zero[8] 회원이 패딩이 있음을 말한다 이해 : 나는 실제 코드 또는 예를하거나 책을보고 할 때마다

// 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 
}; 

항상 다음과 유사한 코드 구조를 가지고 0으로 설정해야하지만 나머지는 0으로 설정해야합니다. 특히 선언의 다음 몇 라인에서 대부분 초기화됩니다. 심지어 sin_zero 회원에 관한 beej 프로그래밍 가이드 said it is not mandatory to zero them out anymore. 나는 설명을 찾았지만 요점은 밝혀지지 않았다. 이 stack overflow question에는 초기화 자체에 대한 몇 가지 제안 사항이 있지만 제로가 필요한 이유는 설명하지 않습니다.

레거시 사례입니까, 아니면 실종 되었습니까? 모든 참조를 주셔서 감사합니다.

+1

가비지 값에 의존하는 코드로 끝나지 않도록합니다. 이러한 코드는 Heisenbugs 및 디버그하기 어려운 다른 버그를 생성 할 수 있습니다. –

+1

또는'struct sockaddr_in foo = {AF_INET, htons (1025)};'는 더 짧고 나머지 멤버 만 0으로 만듭니다. – MSalters

답변

6

기본 생성자로 생각하십시오. 즉, 데이터를 알려진 값 (이 경우 0)으로 초기화합니다. 이것은 memset이 정말로 필요하지 않고 sockaddr_in foo{};으로 구조체를 값 초기화 할 수 있지만 멤버 설정을 잊어 버린 것과 같이 POD를 사용할 때 초기화되지 않은 데이터와 관련된 문제를 완화하는 데 도움이 될 수 있습니다. 컴파일러로서의 장면들은 memset을 호출하는 대신 모든 것을 처리 할 수 ​​있으며, 99 %의 경우에서 많은 차이를 만들 수는 없습니다.)

절대적으로 모든 회원을 설정할 예정이라면 꼭 필요한 것은 아니지만 초기화하는 것을 잊어 버리면 먼저 버그를 파악하는 데 도움이 될 수 있습니다.