C 구조체 멤버를 구조체 포인터 변수를 이용해 초기화 시키려면..

bboy6604의 이미지

#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 언어 기본서로 공부하는 초보입니다. 책에는 구조체 포인터 변수를 통해서 구조체 멤버를 초기화 하는 방법에 대해서는 기술 되어

있지 않네요. 제 나름대로 이렇게 하면 될까 하고 코드를 생각해봤는데 역시나 무반응입니다. 어떤식으로 하면 가능할까요?

라스코니의 이미지

struct person* pMan;

부분을

person* pMan = new person Man;

또는

person Man;
person *pMan = &Man;

으로 해주세요.

bboy6604의 이미지

구조체 변수를 선언해주고 그 주소값을 구조체 포인터 변수에 대입하는 수 밖에 없군요.

답글 감사합니다 ^^

jw8704의 이미지

그러면 어떤 다른 방법이있을것으로 생각하셨나요..

따지는것아닙니다.

bboy6604의 이미지

구조체 포인터 변수 선언과 동시에 일반 변수처럼 초기화 시킬 수 있을지 알았습니다.
일반 구조체 변수를 대입해주는 식말고 바로요 ^^;

breadncup의 이미지

struct person* pMan;
pMan = (struct person *) malloc (sizeof(struct person));

와 같이 초기화를 해주어야 합니다.

struct person* pMan; 이라고 하면, pMan 이라는 변수는 어떤 주소 (address)를 가리킬 수 있는 포인터 변수입니다. 이 변수는 처음에는 아무 주소나 가지게 되지요. 이 변수가 제대로 쓰일 수 있도록 하려면, 이 변수가 제대로 쓸 수 있도록 data가 있는 곳을 할당해 주어야 합니다. malloc은 heap 영역에 있는 한 공간의 따로 떼어서 size로 받은 parameter 만큼 준비시켜서 주소를 리턴하게 되어 있습니다. 즉, pMan = malloc 이 되면, pMan 은 비로소 그 준비된 주소를 받게 되는 것이지요.

만일,

struct person pMan;

라고 되어 있으면, pMan은 stack 영역에 이미 compiler가 준비한 영역을 바로 쓸 수 있게 되는 것입니다. 따라서 malloc 등으로 준비할 필요가 없는 것이지요.

윗분이 쓰신 new 라는 c++ 에서 쓰는 operator는 malloc 과 비슷한 역할을 해줍니다. 만일 c++ compiler가 아닌 c전용 compiler만 쓴다면, new operator는 c compiler가 알 수 없으므로 에러를 리턴할 것입니다.

bboy6604의 이미지

책의 뒷부분에 나오는 내용인데 조금 더 공부하면 약간은 의미를 알수 있는 내용이었군요. 정말 감사합니다^^
미리 조금 봐둬야겠습니다!!

aruee의 이미지

포인터는 그냥 주소값이라고 생각하시면 됩니다. (정확하게는 주소값을 갖는 변수) 따라서 시스템에 따라 그 크기는 달라질 지라도,
모든 data type의 포인터의 크기는 전부 같다고 생각하시면 되고, 모든 포인터는 NULL로 초기화해 주시고 사용하시는 습관을 들이시면 (바로 사용할 주소를 넣는다면 관계없구요) 좋으실듯 하네요.