포인터 참조 질문요...

coldman의 이미지

구조체의 필드를 참조할때 우연히 이상한 점이 있네요...

struct temp
{int k ;
};

struct temp * haha = 0;

printf("%d \n", haha->k ) ; //이건 에러가 나는데...
printf("%d \n", &haha->k); // 이건 왜 에러가 안날까요???

어차피 &haha->k 도 haha->k를 참조하고 주소를 얻는거 아닌지요?

죠커의 이미지

아닙니다. haha->k는 (*haha).k의 의미입니다. 즉, haha가 가리키는 곳의 내용 중 k라는 의미 입니다.

->가 1순위 연산자이고 &은 2순위이니 &haha->k의 의미는 &((*haha).k)의 의미가 되는 것입니다. haha가 가리키는 곳의 내용 중 k의 주소를 의미하는 것입니다.

익명 사용자의 이미지

빠른 답변 고맙습니다. :lol:

그런데
&((*haha).k) 를 구하려면
문법적으로 *haha의 값을 읽어와야 하는것 아닐까요??

죠커의 이미지

구조체 멤버의 순서와 메모리 배열의 순서가 동일해야 하기 때문에 멤버 k가 첫번째 멤버니 구조체 자체의 포인터와 같은 위치를 가집니다. haha든 그의 멤버 k이든 동일한 위치를 말합니다. haha가 pointer형이라면 &haha->k의 주소도 못 얻어올 이유는 없을 것입니다.

(표준에서 null인 구조체 pointer의 멤버의 주소를 참조하는데 제약이 있는지는 모르겠습니다. 아마도 undefined이거나 unspecified일 것입니다.)

하지만 null pointer의 값을 참조하는 것은 잘못된 일이기 때문에 에러가 날 것입니다.

doldori의 이미지

엄밀히 얘기하면 undefined이며 따라서 잘못된 코드입니다. 그런데 <stddef.h>에
있는 매크로 offsetof의 정의를 보면 이와 비슷한 코드가 종종 발견됩니다. 예를 들어
MinGW의 gcc 3.4.2를 보면
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
이것은 일종의 hack으로서 특정 구현체의 제작자는 해당 환경에서 이런 코드가
어떤 결과를 보일지 알고 있으므로 이를 구현의 일부로 제공할 수 있습니다.
그러나 어떤 환경에서도 동작하는 코드를 작성해야 하는 사용자의 입장에서는
이런 코드를 쓰면 안됩니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.