구조체 포인터에 대해서


struct Person {
char name[20];
int age;
char address[100]

};

int main
{

struct Person p1;
struct Person *ptr;
ptr = &p1;
}

int main에서 세번쨰 줄이 없어도 두번쨰줄에서 이미 변수 ptr이

p1의 메모리 주소를 갖기떄문에 세번쨰 줄이 없어도 되지 않나요??

  • 2018년 01월 11일에 작성됨

조회수 92


Banner bitmango

2 답변


좋아요
1
싫어요
채택취소하기

아마 배열이나 다른 언어랑 헷갈리신거 같습니다.

구조체랑 구조체 포인터는 다른 형태의 변수입니다.

확인할 수 있는 간단한 코드를 짜 보았습니다.

#include <stdio.h>

struct Person {
char name[20];
int age;
char address[100];
};
int main(void)
{
    struct Person p1;
    struct Person *ptr;
    char character;
    int integer;
    ptr = &p1;

    printf("size of p1 : %ld\n",sizeof(p1));
    printf("size of ptr : %ld\n",sizeof(ptr));
    printf("size of char : %ld\n",sizeof(character));
    printf("size of int : %ld\n",sizeof(integer));
} 

해당 코드를 실행해보시면 다음같은 결과가 출력될것입니다.

size of p1 : 124
size of ptr : 8
size of char : 1
size of int : 4

보시면 p1과 ptr변수의 크기가 다른것을 볼 수 있죠?

ptr은 포인터형 이기 때문에 8byte의 크기를 갖습니다.

반면, p1은 구조체 내부 구조를 전부 담을 수 있게 char 20개, int 1개 그리고 char 100개 의크기를 더한 124byte의 크기를 갖게 됩니다. [ (1x20) + (4) + (1x100) = 124byte ]

그리고 이후 코드에서 구조체 내부에 접근하는 방법도 조금 다를겁니다. 예를 들어 구조체 내부 age에 접근하고자하면 다음과 같은 방법들로 접근할 수 있겠네요.

int method1 = p1.age;
int method2 = ptr->age;
int method3 = (&p1)->age;
int method4 = (*ptr).age;

아 그리고 다음에 질문해주실때는 마크다운 문법을 읽고 작성해주세요 그편이 보기 좀 더 편하니까요^

  • 2018년 01월 12일에 작성됨
    기계공학과에서 코딩을 배우고 있는 대학생입니다. 아직 부족한 실력이니 많이 도와주세요. 그리고 제가 도움 드릴 수 있는게 있으면 가능한 도와드리고 싶습니다.


struct Person p1;            // 스택에 구조체 Person 크기의 메모리를 할당 
struct Person *ptr;        // 구조체 Person 타입의 포인터 변수 선언
ptr = &p1;                        // 구조체 포인터에 p1 주소 대입

상기의 3번째 줄이 p1의 메모리 주소를 ptr에 대입하는 겁니다.

  • 2018년 01월 11일에 작성됨

  • 답변 정말 감사합니다. 제가 착각을 해서 오개념이 생긴거 같습니다. 감사합니다!    전성주   2018.1.13 16:06     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close