지난번 포스팅은 가볍게 포인터의 개념과 메모리 할당방식에 대한 기본 내용에 대해 살펴봤습니다.
이번에는 조금 더 심화된 포인터변수의 메모리 할당과 자료형에 관하여 포스팅하려고 합니다.
포인터 변수의 메모리 공간 할당
지난번 포스팅에서 변수는 선언되는 자료형, 포인터 변수는 컴파일러에 따라
메모리 공간이 할당된다고 말씀드렸습니다.
변수와 포인터 변수의 자료형 선언을 비교해보면서 이유에 대해 확인해보겠습니다.
변수는 다양한 type의 data를 저장하는 용도로 사용하는 메모리 공간입니다.
(char, int, float, double 등...)
그래서 변수에 저장하려는 data type에 따라 자료형을 선언하여 사용하며,
해당 선언된 변수의 자료형보다 크기가 큰 자료형으로 저장 할 경우 에러가 발생합니다.
(ex) int x = 13.4 , double y = "solt" )
이와 같은 맥락으로 포인터 변수는 메모리의 주소값을 저장하는 용도로 사용하는 메모리 공간인데,
메모리의 주소값은 컴파일러에 따라서 범위가 달라집니다.
만약 PC가 32bit의 컴파일러를 사용한다면 생성 할 수 있는 모든 주소값의 범위는
4Byte로 표현이 가능하기 때문에 포인터 변수는 선언되는 자료형과 별개로
항상 4Byte의 메모리 공간이 할당되는 것입니다.
*64bit 컴파일러 일 경우 : 8byte 포인터 변수
포인터 변수의 자료형
그렇다면 포인터 변수를 선언 시 지정하는 자료형은 무엇일까요?
바로 해당 포인터 변수가 가리키는 곳의 크기를 결정합니다.
이를 예제 소스와 이미지를 통해서 포인터 변수 자료형의 의미와
포인터 변수 메모리 할당방식의 세부과정에 대해 확인해보겠습니다.
지난번 포스팅의 동일한 예제 소스에서 포인터 변수의 자료형만 char*으로 변경하였습니다.
[예제 소스]
컴파일러에 의해서 생성되는 symbol table 또한 포인터 변수 xp의 자료형만 char*으로 변경되어 생성됩니다.
[symbol table]
그리고 논리적인 구조도 마찬가지로 포인터 변수 xp의 자료형만 char*으로 변경되었습니다.
[논리적 구조]
다음으로 메모리 구조를 살펴보면 포인터 변수의 자료형이 char*으로 선언되었기 때문에
가리키는 곳의 메모리 공간중에서 char 자료형의 크기만큼(=1Byte)만을 식별 할 수 있습니다.
그래서 포인터 변수의 자료형은 포인터 변수가 가리키는 변수(=Data Structure)의 자료형과 동일하게 선언을
해주어야만 원하는 값을 식별 할 수 있습니다.
[메모리 구조]
그리고 메모리 구조를 조금 더 세부적으로 살펴보면, 메모리 공간에서는 모든 값이 1Byte단위로 할당됩니다.
그리고 변수 x에 저장된 13(=4Byte) 또한 1Byte로 할당되는데, 이를 이미지로 표현하면 다음과 같습니다.
* 참고 : 13(10진수) -> 0x00001101(16진수)
[메모리 구조- 세부 : Little-Endia]
값을 1Byte단위로 메모리 할당하는 것은 메모리 저장 방식에 따라서 차이가 있으며,
사칙연산을 주로 하는 일반적인 PC는 1Byte 단위의 역순으로 저장(Little-Endian : 리틀-엔디안)되고,
논리 연산을 주로 하는 슈퍼컴퓨터는 1Byte 단위의 순서대로 저장(Big-Endian : 빅-엔디안)됩니다.
포인터의 개념과 메모리 할당과정의 이해1 [기본] :
http://solt.tistory.com/5?category=795285
최대한 정확한 정보를 공유하고자 항상 신중하게 포스팅을 하고 있지만,
내용에 개선이 필요한 부분이 있을 수 도 있습니다.
혹시나 추가적인 보완이 필요하다고 판단되는 부분이 있다면 댓글로 조언해주세요.
참고하여 수정해놓겠습니다.
* 해당 포스팅이 도움이되셨다면 공감과 댓글 부탁드릴께요 ㅎㅎ
'Computer Language > C' 카테고리의 다른 글
포인터의 개념과 메모리 할당과정의 이해1 [기본] (0) | 2018.08.15 |
---|