C언어 기본을 공부하고 있습니다. 책보고 공부하다가 궁금한게 생겼는데요,
typedef struct node NODE typedef NODE *BRTEE; ...... BTREE new_node(void) { return (malloc(sizeof(NODE)); }
이런 구문이 있는데요..
new_node 라는 함수는 인자를 가지지 않고 구조체의 포인터 형을 리턴 해주는 건가요??
오타가 난듯 싶은데요. 오타를 무시하고, 질문의 요점대로 하자면 NODE* 형을 리턴하게 됩니다.
책 연습문제에
struct husband { int age; char name[10]; struct wife spouse; }a;
struct wife { int age; char name[10]; struct husband spouse; }b; 컴파일 오류 발생하는 이유랑 올바르게 코드를 수정하라고 합니다. 컴파일 오류는 아직 선언되지 않은 구조체 wife를 사용해서 발생했다고 생각하고요, 수정하라고 하는데 이 코드의 목적이 husband 구조체 안에 wife 구조체의 기억장소를 할당해주고 싶어하는 거 같다고생각해서.. 구조체 안에 구조체 포인터를 선언해주고..그 구조체 포인터를 wife한테 가라고하고싶은데.. struct wife spouse 대신에, struct husband *wife_pointer; 하고 밑에다가 struct husband *wife_pointer = &b; 라고하면 될가요?ㅠㅠ
상호 참조를 하기 때문입니다. 컴파일 할때 전처리기에서 구조체의 크기를 파악해야 하는데요.
husband 크기를 파악하다보니 int, char 다음에 어? wife라는게 나오네요?
wife의 크기를 파악하러 갑니다.
wife의 크기를 파악하다보니 int, char 다음에 어? husband라는게 나오네요?
husband의 크기를 파악하러 갑니다.
ㄴ결국 이게 무한반복되겠지요?
그러니 님이 말씀하신대로 포인터를 사용하여 해결하면 됩니다.
상호참조라는건 처음 알았네요.. 그런데 구조체 선언을 할 때 아직 선언되지 않은 구조체를 사용해도 관계없는건가요? 컴파일할때요!
선언되지 않은 구조체 "포인터"를 사용해도 관계 없는가?를 물으시는 거지요?
네. 상관 없습니다. 포인터는 타입과 무관하게 "일반적으로 4바이트"의 크기를 가지게 됩니다.
int a; a = b; int b = 3;
이러면 오류발생하잖아요 아직 선언되지 않은 b를 사용해서요~
struct wife { int age; char name[10]; struct husband spouse; }b;
그런데 왜 이 부분은 아직 선언되지 않은 struct wife spouse; 를 했는데 왜 가능한거에요?ㅠㅠ
지금 구조체,리스트 이부분 공부하고있는데 연습문제가 너무 힘드네요 ㅠㅠ 원래 처음 입문하면 이렇게 어려운가요..
struct wife { int age; char name[10]; struct husband spouse; }b; ㄴ이렇게 사용하시면 오류가 나기 때문에..
struct husband { int age; char name[10]; struct wife * spouse; }a;
struct wife { int age; char name[10]; struct husband * spouse; }b; ㄴ이렇게 바꾸셔야 한다는 의미였습니다.
그러니 질문하신 int a; a = b; int b = 3; ㄴ이것과는 뜻이 좀 다른것이지요.
그리고, 좀더 구체적으로 설명을 드리자면 구조체를 선언하는 것은 일종의 타입(int, char, float같은)을 정의하는 것이니까요.
님께서 예로 드신 a, b의 사용과는 좀 다른 의미를 지니게 됩니다.
선질문이 아니라 선테스트가 먼저입니다.
먼저 생각한 답을, 답이 맞는지부터 검증해보고(컴파일) 질문하세요.
텍스트 포맷에 대한 자세한 정보
<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]
말씀하신 그대로입니다.
오타가 난듯 싶은데요.
오타를 무시하고, 질문의 요점대로 하자면 NODE* 형을 리턴하게 됩니다.
죄송한데 너무 초보라 좀 도와주세요 ㅠ
책 연습문제에
struct husband {
int age;
char name[10];
struct wife spouse;
}a;
struct wife {
int age;
char name[10];
struct husband spouse;
}b;
컴파일 오류 발생하는 이유랑 올바르게 코드를 수정하라고 합니다.
컴파일 오류는 아직 선언되지 않은 구조체 wife를 사용해서 발생했다고 생각하고요, 수정하라고 하는데
이 코드의 목적이 husband 구조체 안에 wife 구조체의 기억장소를 할당해주고 싶어하는 거 같다고생각해서..
구조체 안에 구조체 포인터를 선언해주고..그 구조체 포인터를 wife한테 가라고하고싶은데..
struct wife spouse 대신에, struct husband *wife_pointer; 하고 밑에다가 struct husband *wife_pointer = &b; 라고하면 될가요?ㅠㅠ
오류가 발생하는 이유는
상호 참조를 하기 때문입니다.
컴파일 할때 전처리기에서 구조체의 크기를 파악해야 하는데요.
husband 크기를 파악하다보니 int, char 다음에 어? wife라는게 나오네요?
wife의 크기를 파악하러 갑니다.
wife의 크기를 파악하다보니 int, char 다음에 어? husband라는게 나오네요?
husband의 크기를 파악하러 갑니다.
ㄴ결국 이게 무한반복되겠지요?
그러니 님이 말씀하신대로 포인터를 사용하여 해결하면 됩니다.
상호참조!
상호참조라는건 처음 알았네요..
그런데 구조체 선언을 할 때 아직 선언되지 않은 구조체를 사용해도 관계없는건가요?
컴파일할때요!
음..
선언되지 않은 구조체 "포인터"를 사용해도 관계 없는가?를 물으시는 거지요?
네. 상관 없습니다.
포인터는 타입과 무관하게 "일반적으로 4바이트"의 크기를 가지게 됩니다.
앗아뇨~
int a;
a = b;
int b = 3;
이러면 오류발생하잖아요 아직 선언되지 않은 b를 사용해서요~
struct husband {
int age;
char name[10];
struct wife spouse;
}a;
struct wife {
int age;
char name[10];
struct husband spouse;
}b;
그런데 왜 이 부분은 아직 선언되지 않은 struct wife spouse; 를 했는데 왜 가능한거에요?ㅠㅠ
지금 구조체,리스트 이부분 공부하고있는데 연습문제가 너무 힘드네요 ㅠㅠ 원래 처음 입문하면 이렇게 어려운가요..
음?
struct husband {
int age;
char name[10];
struct wife spouse;
}a;
struct wife {
int age;
char name[10];
struct husband spouse;
}b;
ㄴ이렇게 사용하시면 오류가 나기 때문에..
struct husband {
int age;
char name[10];
struct wife * spouse;
}a;
struct wife {
int age;
char name[10];
struct husband * spouse;
}b;
ㄴ이렇게 바꾸셔야 한다는 의미였습니다.
그러니 질문하신
int a;
a = b;
int b = 3;
ㄴ이것과는 뜻이 좀 다른것이지요.
그리고, 좀더 구체적으로 설명을 드리자면 구조체를 선언하는 것은 일종의 타입(int, char, float같은)을 정의하는 것이니까요.
님께서 예로 드신 a, b의 사용과는 좀 다른 의미를 지니게 됩니다.
죄송한데 너무 초보라 좀 도와주세요 ㅠ
책 연습문제에
struct husband {
int age;
char name[10];
struct wife spouse;
}a;
struct wife {
int age;
char name[10];
struct husband spouse;
}b;
컴파일 오류 발생하는 이유랑 올바르게 코드를 수정하라고 합니다.
컴파일 오류는 아직 선언되지 않은 구조체 wife를 사용해서 발생했다고 생각하고요, 수정하라고 하는데
이 코드의 목적이 husband 구조체 안에 wife 구조체의 기억장소를 할당해주고 싶어하는 거 같다고생각해서..
구조체 안에 구조체 포인터를 선언해주고..그 구조체 포인터를 wife한테 가라고하고싶은데..
struct wife spouse 대신에, struct husband *wife_pointer; 하고 밑에다가 struct husband *wife_pointer = &b; 라고하면 될가요?ㅠㅠ
선질문이 아니라 선테스트가 먼저입니다. 먼저 생각한
선질문이 아니라 선테스트가 먼저입니다.
먼저 생각한 답을, 답이 맞는지부터 검증해보고(컴파일) 질문하세요.
댓글 달기