typedef struct AA* pA_t 방식의 사용을 어떻게 해야 하나요?

ioi_ioi의 이미지

첫번째 코드입니다. 컴파일 무리없이 잘 되긴 합니다만
실행에서 세그멘테이션 폴트가 뜹니다.

#include <stdio.h>

struct  AA
{
        int a;
        int b;
};

typedef struct AA*      pA_t;   <- 이부분때문에 이러는거 같습니다.

struct  BB
{
        pA_t    pAA;

};

main()
{
        struct BB       bb;

        bb.pAA->a = 3;
        bb.pAA->b = 3;

        printf ("%d\n", bb.pAA->a);
        printf ("%d\n", bb.pAA->b);
}

두번째 코드입니다. 첫번째와 다른것은 ->를 '.'으로 바꿨습니다.
당연한 에러라 생각합니다.

#include <stdio.h>

struct  AA
{
        int a;
        int b;
};

typedef struct AA*      pA_t;

struct  BB
{
        pA_t    pAA;

};

main()
{
        struct BB       bb;

        bb.pAA.a = 3;
        bb.pAA.b = 3;

        printf ("%d\n", bb.pAA.a);
        printf ("%d\n", bb.pAA.b);
}

gcc struct_test.c
struct_test.c: In function `main':
struct_test.c:21: request for member `a' in something not a structure or union
struct_test.c:22: request for member `b' in something not a structure or union
struct_test.c:24: request for member `a' in something not a structure or union
struct_test.c:25: request for member `b' in something not a structure or union

그렇다면 첫번째 코드는 왜 문제가 있는 것입니까?

세그멘테이션 폴트가 뜰줄은 전혀 몰랐습니다.

그리고 커널 안에서는 첫번째 코드 방식의 접근은 커널 컴파일 자체를 못하게 하는군요. 저런식의 구조체를 추적해서 정보를 얻어오려고 하니까..

아래와 같은 에러가 납니다.

codexxx.c:1701: dereferencing pointer to incomplete type
codexxx.c:1702: dereferencing pointer to incomplete type

왜 저런 현상이 일어나는지요?
그리고 첫번째 코드방식으로
struct AA의 멤버들을 접근하려면 어떻게 해야 하나요?
고수님들의 답변 부탁드립니다.

doldori의 이미지

ioi_ioi wrote:
그렇다면 첫번째 코드는 왜 문제가 있는 것입니까?

BB의 멤버인 포인터가 초기화되지 않아서 그렇습니다. 아래와 같이 하면 될 것입니다.
꼭 malloc()으로 초기화해야 하는 것은 아니고, 유효한 AA 개체만 가리키면 됩니다.
struct BB       bb; 
struct AA       aa;
bb.pAA = malloc(sizeof(*bb.pAA));  // or
bb.pAA = &aa;

ioi_ioi wrote:
그리고 커널 안에서는 첫번째 코드 방식의 접근은 커널 컴파일 자체를 못하게 하는군요. 저런식의 구조체를 추적해서 정보를 얻어오려고 하니까..

아래와 같은 에러가 납니다.

codexxx.c:1701: dereferencing pointer to incomplete type
codexxx.c:1702: dereferencing pointer to incomplete type

왜 저런 현상이 일어나는지요?
그리고 첫번째 코드방식으로
struct AA의 멤버들을 접근하려면 어떻게 해야 하나요?
고수님들의 답변 부탁드립니다.


codexxx.c에서 struct AA의 정의를 알지 못하기 때문입니다. 단순히
struct AA;
typedef struct AA*      pA_t; 

정도로 되어 있겠죠. 이 경우에 AA라는 이름은 구조체를 나타내는 이름일 뿐 구조체의
멤버가 무엇인지 알 수 없는 것은 당연합니다. 구조체의 완전한 정의까지 알려져야
멤버에 접근할 수 있습니다.
ioi_ioi의 이미지

Quote:
codexxx.c에서 struct AA의 정의를 알지 못하기 때문입니다. 단순히
코드:
struct AA;
typedef struct AA* pA_t;

정도로 되어 있겠죠. 이 경우에 AA라는 이름은 구조체를 나타내는 이름일 뿐 구조체의
멤버가 무엇인지 알 수 없는 것은 당연합니다. 구조체의 완전한 정의까지 알려져야
멤버에 접근할 수 있습니다.

지금 제가 보는 커널 소스에서 구조체에 대한 멤버에 대한 정의는 xxx.c에 되어있습니다. 만일 그것이 .h파일에 있다면 간단하게 인클루드해서 쓰겠는데 그렇게 안되어있다는 겁니다.
그렇다고 그 구조체의 정의를 긁어다 지금 커널 소스에 붙힐수도 없는것이 그안에 또다른 구조체 멤버 필드가 너무 많기때문입니다.
그러다보면 갖다 붙히기 하다가 모든 헤더를 넣어야 될까 걱정스럽습니다.

다른 .c파일에 있는 구조체의 정의부분을 내가 만지는 .c파일에서 구조체의 재정의 없이 쓸수 있는 방법이 없을까요?

한 수 부탁드립니다.

doldori의 이미지

ioi_ioi wrote:
다른 .c파일에 있는 구조체의 정의부분을 내가 만지는 .c파일에서 구조체의 재정의 없이 쓸수 있는 방법이 없을까요?

당연한 얘기입니다만 그런 방법은 없습니다.
보다 근본적인 문제를 생각해보면 그 구조체의 정의가 .c 파일에 있다는 것은
다른 소스에 알려질 필요가 없거나 알려져서는 안된다는 의도를 나타내는 것입니다.
즉 내부적인 구현에만 사용될 뿐이라는 뜻이지요. 일반적인 상황이라면 xxx.h가
따로 있을 테니 그 헤더에서 제공하는 것만으로 해결을 하는 방법을 고려해 보십시오.
ioi_ioi의 이미지

아..
네 어쩔수 없는 것이었군요.
알려주셔서 감사해요.
시간 아낄수 있어서 정말 다행입니다.
^^

댓글 달기

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