프로그래밍
첫 페이지 회원가입 로그인
비공개 손님 2016-09-19 00:13:48
이번엔 C 구조체 포인터 질문 하나만 드리겠습니다..

안녕하세요

C언어 자기참조 구조체에 대해서 공부하고있는데 한가지 의문이 들어서 질문드립니다.

typedef struct lists
{
    char *name;
    int grade;

    struct lists *next;
} list;

list *student;

student = (list *)malloc(sizeof(list));


여기서 어떻게 해서 student에 lists 구조체가 메모리 할당되어, 그걸 가리키는 포인터값이 들어가는지 헷갈립니다..

말이 애매해서 더 자세하게 적어보자면..


1.  list *student; 를 해서 lists구조체만 가리킬수 있는 구조체포인터 student를 선언하고
2. student = (list *)malloc(sizeof(list)); 으로 메모리 어딘가에 lists 구조체 크기만큼의 메모리를 동적할당해서 반환되는 void포인터를 (list )로 캐스팅해서 student에 넣습니다.

여기서 궁금한게 단지 메모리를 할당해서 반환되는 포인터를 넣었을 뿐인데 그게 구조체가 생성되는걸로 볼수 있는건가요? (list *)로 캐스팅하고 student로 넣는 것만으로도 어떻게 구조체가 생성되는지 이해가 되지 않습니다..

malloc으로 메모리 할당받고 그걸 가리키는 포인터를 특정 형으로 캐스팅하면 , 특정 형을 정의 한 것이랑 같게 되는건가요..?

질문 | 1048명이 읽었어요. 3.237.27.159 |

0
1 비공개 손님 2016-09-19 00:43:55
네 그거 맞아여.
2 비공개 손님 2016-09-19 00:44:55
까짓거 다른 타입 포인터로도 접근할 수 있을듯
단지 student+1같은 거 했을 때, +1로 실제 건너뛰는 메모리 크기가 다르겠져 뭐(c알못)
3 비공개 손님 2016-09-19 01:25:25
malloc 함수가 lists 구조체 크기만큼 메모리를 할당했지만, C 컴파일러는 이 메모리가 lists 구조체 모양인지 모릅니다. 그래서 (list *)로 캐스팅을 해주는 것이지요. 이 말은 C 컴파일러가 malloc이 할당해주는 메모리를 lists 구조체 용도로 쓰겠다는 뜻입니다.

int 랑 char를 생각하시면 될 것 같네요. 얘네들은 메모리 크기는 같고, 안에 들어있는 정보도 똑 같다고 가정했을 때, 아래 두 함수의 실행 결과는 다르게 나타납니다.

printf("%d", a); // 요때는 a가 int 형
printf("%c", a); // 요때는 a가 char 형

즉, 메모리의 내용을 int형으로 사용할지, char형으로 사용할지에 따라 결과가 달라집니다.

답변 2 같은 연산을 할 때라던가, 같은 메모리 크기라도 서로 다른 두 구조체를 구분할 필요라던가 등, C 컴파일러가 구조체 모양을 알아야 할 필요가 있기에 캐스팅을 하는 것입니다.

>> malloc으로 메모리 할당받고 그걸 가리키는 포인터를 특정 형으로 캐스팅하면 , 특정 형을 정의 한 것이랑 같게 되는건가요..? : 네 맞습니다만, 이때, 메모리를 특정형보다 크게 잡아줘야겠죠. 특정형의 정수배로 할당을 하는 것이 일반적입니다.
4 비공개 손님 2016-09-19 13:35:57
단지 메모리를 할당해서 반환되는 포인터를 넣었을 뿐인데 그게 구조체가 생성되는걸로 볼수 있는건가요?


메모리를 할당한 것이 바로 구조체가 생성된 것입니다.
포인터는 단지 그 구조체의 주소를 기억하는 것 뿐이구요.
5 비공개 손님 2016-09-19 13:38:04
구조체라는 것은 단순히 할당된 메모리 영역이라고 생각하시면 됩니다.
그 멤버 변수들은 그 메모리 영역에서의 순서일 뿐이구요.

예시의 구조체인 경우 32bit 환경을 예로 들자면
student = 0x10000 의 값을 가질 경우 (예시)
&(student->name) = 0x10000
&(student->grade) = 0x10004
&(student->next) = 0x10008
의 값을 가질 뿐입니다.
댓글을 작성하실 수 없습니다.
(권한이 없는 회원레벨)
목록으로
이용약관 | 광고/제휴 | 개인정보취급방침 | 문의/신고 | 모바일 TE31 | 서버 부하 : 5.5%
실시간 Issue 커뮤니티 TE31 [알지롱] ⓒ 2002-2021
TOP arrow_upward