250x250
Notice
Recent Posts
Recent Comments
관리 메뉴

탁월함은 어떻게 나오는가?

[C] 포인터와 옵셋을 사용하여 문자열의 주소 저장 방식을 확인해보자 본문

[Snow-ball]프로그래밍(컴퓨터)/C, C++

[C] 포인터와 옵셋을 사용하여 문자열의 주소 저장 방식을 확인해보자

Snow-ball 2023. 10. 4. 22:00
반응형

컴퓨터로 어떤 값(value)를 저장할때는 항상 어떤 메모리의 일부분을 차지하게 된다. 그것이 int, float, double, char 어떤 것이든 말이다.

 

그리고 int형이라면 4byte로 구성되어 있을것이고, 실무로 들어가게 되면 int형 변수 100개 이상을 만들게 되는 경우가 많은데 변수 100개를 선언하기 위해 이름을 일일이 부여하는것도 쉽지 않으며 접근 방법도 복잡하다.

 

하지만, 포인터를 사용하게 되면 간단하게 사용이 가능해진다. 100개 중에 이름은 맨앞의 변수에 하나만 부여하고 나머지 99개에 상대적인 번호를 부여한다면 매우 쉽게 찾을 수 있을 것이다.

 

아파트 101호를 기준으로 옆집은 102호 옆옆집은 103호로 찾을 수 있는 원리라고 생각하면 좋을듯 하다.

 

 

 


 

 

 

옵셋이란?

옵셋(Offset)은 메모리의 간격을 의미한다. 위에서 언급했듯이 특정 변수 주소에 일정한 값을 더하거나 빼면 그만큼 떨어진 메모리의 주소를 알 수 있게 된다. 예를들면 int형 변수(4byte) 변수 기준으로 + 1은 4바이트가 떨어져있는것이고, + 3은 12바이트가 떨어져있는 것이다. 예시에서 더하거나 빼는 값을 옵셋이라한다.

 

 

 


 

 

 

그렇다면 위의 개념들을 가지고 포인트를 사용한 문자열을 출력할 수 있게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main() {
 
    char* pszData = "Test string!";
    printf("[%p] %c\n", pszData, *pszData);
    printf("[%p] %c\n", pszData + 1*(pszData + 1));
    printf("[%p] %c\n", pszData + 2*(pszData + 2));
    printf("[%p] %c\n", pszData + 11*(pszData + 11));
    printf("[%p] %c\n", pszData + 12*(pszData + 12));
 
    return 0;
}
cs

 

위의 코드에서 pszData는 "T"만 저장하는 것이다. 그리고 char형이기 때문에 1바이트씩 옆주소에 값들이 저장되어 있을 것이다.

 

 

문자열의 끝은 NULL이기 때문에 널이 뜨는것도 확인이 가능하다. 그렇다면 더 자세히 관찰하기 위해서 디버그 모드로 확인을 해보자.

 

 

 

 


 

 

 

디버그 모드

 

디버그 모드에서 &pszData를 확인하면 아래와 같이 저장되 있는 주소값을 확인할 수 있다.

 

[ 0x0000000100a4ff90 ] 에 존재한다고 해당 주소로 넘어가보자. 그렇다면 해당주소에 54가 존재하는걸 확인할 수 있다.

16진수 [ 54 ] 는 Symbol [ T ] 이기 때문에 올바르다는게 확인이 가능하다.

 

그 옆을 확인해보면 주소는 [ 0x0000000100a4ff91 ] 이면서 16진수 [ 65 ] 를 확인할 수 있다. 그리고 65는 Symbol [ e ] 를 뜻하니 올바른것이 확인되었다. 

 

디버그 모드로 확인해본 결과 밑에 체크한 만큼 1바이트씩 저장되있는걸 확인해 볼 수 있다. 그리고 0은 C언어에서 NULL을 뜻하므로 개행을 의미한다. 그리고 그 주소는 [ 0x0000000100a4ff9c ] 를 확인할 수 있고, 위에서 찍힌 주소와 동일하다는걸 확인할 수 있다.

 

 

 

반응형
Comments