C 구조체 멤버를 구조체 포인터 변수를 이용해 초기화 시키려면..
글쓴이: bboy6604 / 작성시간: 토, 2010/05/08 - 9:51오전
#include
#include
struct person{
char name[20];
char phone[20];
};
int main(){
struct person* pMan;
strcpy(pMan->name,"mark");
strcpy(pMan->phone,"343-4343");
printf("name : %s\n", pMan->name);
printf("phone: %s\n", pMan->phone);
return 0;
}
C 언어 기본서로 공부하는 초보입니다. 책에는 구조체 포인터 변수를 통해서 구조체 멤버를 초기화 하는 방법에 대해서는 기술 되어
있지 않네요. 제 나름대로 이렇게 하면 될까 하고 코드를 생각해봤는데 역시나 무반응입니다. 어떤식으로 하면 가능할까요?
Forums:
잘 하셨는데
struct person* pMan;
부분을
person* pMan = new person Man;
또는
person Man;
person *pMan = &Man;
으로 해주세요.
결국은..
구조체 변수를 선언해주고 그 주소값을 구조체 포인터 변수에 대입하는 수 밖에 없군요.
답글 감사합니다 ^^
그러면..
그러면 어떤 다른 방법이있을것으로 생각하셨나요..
따지는것아닙니다.
저는..
구조체 포인터 변수 선언과 동시에 일반 변수처럼 초기화 시킬 수 있을지 알았습니다.
일반 구조체 변수를 대입해주는 식말고 바로요 ^^;
초기화가 되어 있지 않았네요.
와 같이 초기화를 해주어야 합니다.
struct person* pMan; 이라고 하면, pMan 이라는 변수는 어떤 주소 (address)를 가리킬 수 있는 포인터 변수입니다. 이 변수는 처음에는 아무 주소나 가지게 되지요. 이 변수가 제대로 쓰일 수 있도록 하려면, 이 변수가 제대로 쓸 수 있도록 data가 있는 곳을 할당해 주어야 합니다. malloc은 heap 영역에 있는 한 공간의 따로 떼어서 size로 받은 parameter 만큼 준비시켜서 주소를 리턴하게 되어 있습니다. 즉, pMan = malloc 이 되면, pMan 은 비로소 그 준비된 주소를 받게 되는 것이지요.
만일,
라고 되어 있으면, pMan은 stack 영역에 이미 compiler가 준비한 영역을 바로 쓸 수 있게 되는 것입니다. 따라서 malloc 등으로 준비할 필요가 없는 것이지요.
윗분이 쓰신 new 라는 c++ 에서 쓰는 operator는 malloc 과 비슷한 역할을 해줍니다. 만일 c++ compiler가 아닌 c전용 compiler만 쓴다면, new operator는 c compiler가 알 수 없으므로 에러를 리턴할 것입니다.
아하!
책의 뒷부분에 나오는 내용인데 조금 더 공부하면 약간은 의미를 알수 있는 내용이었군요. 정말 감사합니다^^
미리 조금 봐둬야겠습니다!!
포인터는 주소
포인터는 그냥 주소값이라고 생각하시면 됩니다. (정확하게는 주소값을 갖는 변수) 따라서 시스템에 따라 그 크기는 달라질 지라도,
모든 data type의 포인터의 크기는 전부 같다고 생각하시면 되고, 모든 포인터는 NULL로 초기화해 주시고 사용하시는 습관을 들이시면 (바로 사용할 주소를 넣는다면 관계없구요) 좋으실듯 하네요.
댓글 달기