1.
int a=3;
int *pa;
*pa=3;
하면 오류나길래
pa에 주소가 일단 지정되어 있지 않아서 오류구나 라고 생각했거든요.
근데 구조체 만들 때
struct Student *s1 = malloc(sizeof(struct Student));
로 하던데 malloc으로 반환되는건 주소가 아니라 메모리 크기라고 생각했는데
그게 아니라 메모리 크기만큼 OS에서 할당 한 후 그 주소의 제일 앞 부분을 리턴하는건가요?
2. 그게 맞다면 위의 pa관련 코드를 pa=&a;로 바꿔서 pa의 실체가 a라는 명칭이 있지만 s1의 실체는 명칭이 없는 건가요?
3.
struct Student *current = s1;
for (;current != NULL;current=current->next)
{
printf("%.2lf\n", current->grade);
}
Student라는 구조체가 double grade과 Student *next를 가지는데
grade를 순서대로 출력하라고 할 때 이렇게 쓰니까 되더라구요.
*s1, *s2, *s3는 제대로 구현했고 실제로 동작도 잘 합니다.
s1이 실제 구조체가 아니라 구조체 포인터니까 직접 next와 grade를 갖는게 아니라
s1은 안가지고 있고 다른 공간에 next와 grade가 있을거고
*current가 갖고있는 값을 s1의 주소인데도 왜 오류가 안날까요?
(current,[s1의주소]) (s1,[실제구조체주소]) ([next=s2주소],[grade=100])
s1->grade = 100인건 이해가 가는데, current->grade가 왜 바로 s1->grade가 되는지 모르겠습니다. ㅠㅠ
current->->grade같은게 될 것 같은데 ...
1,2번이 맞다고 가정하고 메모리에 들어갈 것들을 표현했는데 이게 맞을까요?
포인터들에 들어간 값은 주소를 의미합니다.
*s1, *s2들이 갖는 실제 구조체들은 이름이 없습니다. 구조체포인터들은 구조체 주소만을 가집니다.
시스템 함수던 어떤 것이던 사용하는데 있어 궁금증이 생긴다면 레퍼런스 문서를 찾아보시는게 좋습니다.
http://www.cplusplus.com/reference/cstdlib/malloc/ 을 보시면, malloc은 인자로 주어진 크기만큼의 바이트를 메모리에 할당하고, 해당 블록의 시작 주소를 반환합니다.
2.
주어진 코드만 보았을 때에는 a와 pa는 아무런 관계가 없습니다.
게다가 pa는 초기화도 되어 있지 않으므로 메모리 상의 어느 주소를 가르키고 있는지도 모릅니다. 마구잡이로 아무 주소나 역참조 하여 3이라는 값을 저장하려고 하면 segfault 내지는 허용되지 않은 메모리 접근이라고 오류가 발생하겠지요.
pa = &a; 로 주소를 지정해 줌으로써 a와 pa는 비로소 참조 관계를 갖게 됩니다.
그리고 변수의 실체... 라고 하면 스택과 힙 같은거로 파고들어가야 해서 머리아파집니다만, 기술하신 내용이 넓은 범위에서 틀리지는 않습니다.
3.
s1과 current 모두 Stduent 구조체를 가리키는 포인터입니다. current를 초기화하면서 저장한 값은 s1이라는 변수의 주소인가요? 아니면 s1 변수의 값(=s1이 가리키고 있는 구조체의 주소)인가요? 한 번 생각해 보시면 답이 나올 것입니다.