내가 엣날에 한창 자료구조공부햇을떄 문법적으로 힘들고 막힌점이많앗고 , 그러한점들을 스스로 연구하면서 내가 내린결론이있는데 지금은 비록 C말고 자바스크립트하지만 군대가기전에 그냥 물어보고싶다ㅎ

 

코드부터보자 ㅎ

 

 

질문들어가기전에 정의하고넘어갈것. 

 A,B,C변수는 스택에서 정적으로 메모리에서 4바이트공간을 할당받은뒤 , 각각의 시작주소값을 A와B와C에게주었다. 여기서 A는 1000~1003 공간을, B는 1010~1013공간을 , C는 1020~1023 공간을할당받앗다치자. 그럼 A는 1000주소값을 , B는 1010주소값을 , C는 1020주소값을 갖고있다.

 

질문들어감.

1. 11행과 12행에서 힙메모리에서부터 8바이트를 공간할당받았다. 하나는 2000~2007 , 두번째는 2010 ~ 2017 그리고 각각의 시작주소값을 캐스팅한뒤 A와 B변수에 주었다. 즉 A는 2000번지의주소값을갖고있으며 , B는 2010번지의주소값을갖고있다. 이렇게 시작주소값을갖고있으면 할당받은메모리영역전체를 controll할수있다. 즉 , 할당받은메모리영역에대해서 CRUD를 할수있다고볼수있지. 

 

2. 10행에서 선언햇을떄의 정적으로할당받은 A와 C의 메모리영역은 결국 버려지게되고 새로운 메모리영역을 가리키게되므로 8바이트는 낭비되는것이다. 그나마 포인터변수가4바이트이기때문에 이러한 메커니즘이 프로그램의 퍼포먼스에 영향을끼치지는 않을거라고 판단된다.

 

2. 근데 여기서 캐스팅왜할까? 그이유는 바로 주소값체계(운영체제나이런걸공부해본적이없기때문에 그냥 내마음대로이름붙였따) 때문이다.

힙에서 8바이트공간을할당해줫고 이 메모리를 a라는자료형으로 맞추기위해서 캐스팅햇다. 즉 ,이말은 앞으로 이 메모리를 controll할려면 이 메모리의시작주소값을 받을수있는 변수는 a라는자료형이어야 된다. 이렇게 자료형을맞춰주는이유는 주소값쳬게가 무너지는것을 막기위함이다

 

3.  13행에서 실제로 값을쓸때는 16비트 2진수로쓴다. A->data에 5를쓰고잇는데 A->data는 2000~2003 영역일것이다.  하지만실제로 2000번지에만 쓰여질것이다. 왜냐하면 2000번지하나로도 5라는값은 표현할수있기때문이다.

 

4. 16행에서 B가 A의주소값을대입받는다. 즉 이것을 B가 A를 가리킨다라고도 표현할수있지. 그런데 여기서 재대로짚고넘어가야할게있다.

B는 과연 동적할당을 받지않아도되는것일까?

그렇다. 사실동적할당이란게 힙메모리에서 메모리영역을할당받고 단순히 그의시작주소값만 변수에할당해서 변수가 그 메모리영역을 controll하는거기때문에 , B라는 포인터변수가 시작주소값만가지고있으면 B변수도 그 영역을 controll할수있다. 이게 포인터의 핵심중에 하나라고 생각한다.

마지막으로 , 14행의 A->next가 C를가리키는 메커니즘도 방금말한것과 동일하다. 그런데 next는 자기참조구조체로써 , a라는자료형(구조체)의 포인터변수다. 그래서 C의주소값을 대입받을수가있다. C는 a라는자료형의포인터변수이므로 좌변과 우변의 자료형이 일치하며 , 2번질문에서 말한 주소값쳬계때문이라고도볼수있다.

 

5. 17행에서 B도 2000번지를 가르키게되엇으므로 4번질문에서 말햇다시피 2000번지에서 2007번지까지의 메모리영역을 controll할수있다. 그래서 B->data 즉 , 2000~2003 영역에 5라는값을썻다.

 

나는 ㅅㅅㅅ하고 코세가 좋은답변을 달아줄것이라고 믿는다ㅋ. 그런데 한가지만 부탁하자. 답변을달아주기전에 먼저 1,2,3,4,5번질문에 맞다,아니다 부터 말해주고 아니다라면, 그에대한설명을해주면좋겠다.

 

코드명 : 'sexer'