구조체 포인터에 대해서

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

};

int main
{

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

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

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

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;
    

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

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

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

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

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.