메모리 할당에 관련된 질문인데요..
글쓴이: 익명 사용자 / 작성시간: 수, 2002/03/27 - 5:34오후
안녕하세요?
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주소나포
트번호에 대해 문제가 된다고 했는데요..
무슨말인지 이해가 안되네요..
설명 해주실수있나요? 설명 부탁드립니다..
Forums:
Re: 메모리 할당에 관련된 질문인데요..
이미 관련 질답이 많이 오고간 내용입니다. 이 내용은 결국
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 이
문제를 일으키지 않도록 주소를 정렬 시키게 됩니다.
그렇군요^^.. 감사합니다..
정말 명확한 설명이군요^^.. 감사합니다..
댓글 달기