typedef struct AA* pA_t 방식의 사용을 어떻게 해야 하나요?
글쓴이: ioi_ioi / 작성시간: 화, 2006/01/03 - 5:10오후
첫번째 코드입니다. 컴파일 무리없이 잘 되긴 합니다만
실행에서 세그멘테이션 폴트가 뜹니다.
#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의 멤버들을 접근하려면 어떻게 해야 하나요?
고수님들의 답변 부탁드립니다.
Forums:
Re: typedef struct AA* pA_t 방식의 사용을 어떻게 해야 하나요?
BB의 멤버인 포인터가 초기화되지 않아서 그렇습니다. 아래와 같이 하면 될 것입니다.
꼭 malloc()으로 초기화해야 하는 것은 아니고, 유효한 AA 개체만 가리키면 됩니다.
codexxx.c에서 struct AA의 정의를 알지 못하기 때문입니다. 단순히
정도로 되어 있겠죠. 이 경우에 AA라는 이름은 구조체를 나타내는 이름일 뿐 구조체의
멤버가 무엇인지 알 수 없는 것은 당연합니다. 구조체의 완전한 정의까지 알려져야
멤버에 접근할 수 있습니다.
네 자세히 보니깐 돌도리님의 말씀이 맞네요.
지금 제가 보는 커널 소스에서 구조체에 대한 멤버에 대한 정의는 xxx.c에 되어있습니다. 만일 그것이 .h파일에 있다면 간단하게 인클루드해서 쓰겠는데 그렇게 안되어있다는 겁니다.
그렇다고 그 구조체의 정의를 긁어다 지금 커널 소스에 붙힐수도 없는것이 그안에 또다른 구조체 멤버 필드가 너무 많기때문입니다.
그러다보면 갖다 붙히기 하다가 모든 헤더를 넣어야 될까 걱정스럽습니다.
다른 .c파일에 있는 구조체의 정의부분을 내가 만지는 .c파일에서 구조체의 재정의 없이 쓸수 있는 방법이 없을까요?
한 수 부탁드립니다.
Re: 네 자세히 보니깐 돌도리님의 말씀이 맞네요.
당연한 얘기입니다만 그런 방법은 없습니다.
보다 근본적인 문제를 생각해보면 그 구조체의 정의가 .c 파일에 있다는 것은
다른 소스에 알려질 필요가 없거나 알려져서는 안된다는 의도를 나타내는 것입니다.
즉 내부적인 구현에만 사용될 뿐이라는 뜻이지요. 일반적인 상황이라면 xxx.h가
따로 있을 테니 그 헤더에서 제공하는 것만으로 해결을 하는 방법을 고려해 보십시오.
감사합니다.
아..
네 어쩔수 없는 것이었군요.
알려주셔서 감사해요.
시간 아낄수 있어서 정말 다행입니다.
^^
댓글 달기