메모리 할당에 관련된 질문인데요..

익명 사용자의 이미지

안녕하세요?
unix network programming란책 있죠? richard stevens가 쓴..
이책 보다가 이해안되는 부분이 있어서..
11.8절에있는 11.7소스에서요..

char sockaddr[MAXSOCKADDR];

으로 메모리를 할당하는것보다..

struct sockaddr *sa;
sa = malloc(MAXSOCKADDR);

또는

union temp{
struct sockaddr addr;
char data[MAXSOCKADDR];
}un;

로 메모리 할당해서 써야한다고 해놓았는데요..
그리고, 이유는 char 배열은 홀수바이트경계로 할당되기때문에,ip주소나포
트번호에 대해 문제가 된다고 했는데요..
무슨말인지 이해가 안되네요..
설명 해주실수있나요? 설명 부탁드립니다..

익명 사용자의 이미지

이미 관련 질답이 많이 오고간 내용입니다. 이 내용은 결국
struct _my_struct {
char a;
int b;
};
가 5 바이트가 아니라, 8 바이트가 되는 이유와 같습니다.

즉, n바이트를 한번에 읽고 쓰는 작업을 할 수
있는 주소는 n 배수 주소 상에 존재해야 합니다.
예를 들면 char 는 임의 주소에, short 는 2배수,
long 은 4배수, double 은 8배수 주소에 정렬되지요.

char sockaddr[MAXSOCKADDR];
스택이나 데이터 영역에 할당될 수 있는 이 메모리는 char 임이
명시적으로 지정되어 있으므로, 컴파일러가 시작주소를 임의로
배치할 수 있습니다. 만일 이 메모리가 struct sockaddr* 로
캐스트 되면, sockaddr 멤버들은 각각 자신에게 맞는 정렬된
주소에 배치되지 못할 가능성이 있습니다.

반면 malloc 은 스택이나 전역 데이터처럼 컴파일시 처리되지
않고 실시간에 처리되기 때문에, 리턴되는 주소는 이미 적절한
크기로 정렬된 주소 선상에 배치될 것입니다. 적어도 모든 단위
데이터, ( char, short, int, long, float, double,
long double, 등 ... ) 의 최소 공배수가 되어야 겠지요. 이것은
malloc 이 알아서 처리합니다.

union 을 사용한 경우 컴파일러는 struct sockaddr addr 이
문제를 일으키지 않도록 주소를 정렬 시키게 됩니다.

익명 사용자의 이미지

정말 명확한 설명이군요^^.. 감사합니다..