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

익명 사용자의 이미지

안녕하세요?
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 이
문제를 일으키지 않도록 주소를 정렬 시키게 됩니다.

익명 사용자의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.