C언어/잡학사전

[C언어] 포인터 오프셋 (pointer offset)

아무일도없었다 2022. 9. 13. 17:45

C언어를 사용하면 포인터를 사용해야하는 빈도가 굉장히 높다. (사실 매번 쓴다.)

 

포인터의 활용은 상당히 다양하고 범위가 넓지만 그중에서도 오프셋을 계산하는 주제를 다뤄보려 한다.

 

포인터의 오프셋 ?

 

이 글에서의 포인터 오프셋은 포인터를 움직이면서 계산하는 것을 의미한다.

 

이러한 방법은 네트워크에서의 가변 데이터(패킷)을 다루거나 buffer 에 데이터를 적재할때 흔히 사용한다. 

 

그렇다면 아래 그림에서의 offset 의 값은 무엇일까 ?

 

 

pointer 를 offset 만큼 움직인다면 ?

 

pointer 가 0 에서 12 로 이동했으니 offset = 12 라고 생각하기 쉽다.

 

당연히 12 만큼 주소를 이동했지만 실제 코드 구현에서는 12 가 정답이 아닐 수 있다.

 

 

< 예제 코드 1 >

#include <stdio.h>

#define MAX_BUF_SIZE 128

int main()
{
    char buffer[MAX_BUF_SIZE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    char* pointer;
    int offset;
    
    pointer = buffer;
    
    for(offset=0; offset<5; offset++) {
        printf("pointer+offset[%p] offset[%d] data[%c]\n", pointer+offset, offset, *(pointer+offset));
    }
    
    return 0;
}

 

< 예제 코드 2 >

#include <stdio.h>

#define MAX_BUF_SIZE 128

int main()
{
    char buffer[MAX_BUF_SIZE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int* pointer;
    int offset;
    
    pointer = buffer;
    
    for(offset=0; offset<5; offset++) {
        printf("pointer+offset[%p] offset[%d] data[%c]\n", pointer+offset, offset, *(pointer+offset));
    }
    
    return 0;
}

 

위의 두개의 코드가 있다.

 

두 코드의 다른점은 pointer 변수 타입(char *, int *) 이다. (실제로는 struct 도 많이 쓰인다.)

 

동일한 offset 값을 통해서 다음 주소를 찾아갈때 어떤식으로 접근되는지 실행해보면 아래와 같은 결과가 나온다.

 

 

< 예제 코드 1 결과 >

pointer+offset[000000000061FD50] offset[0] data[A]
pointer+offset[000000000061FD51] offset[1] data[B]
pointer+offset[000000000061FD52] offset[2] data[C]
pointer+offset[000000000061FD53] offset[3] data[D]
pointer+offset[000000000061FD54] offset[4] data[E]

 

< 예제 코드 2 결과 >

pointer+offset[000000000061FD50] offset[0] data[A]
pointer+offset[000000000061FD54] offset[1] data[E]
pointer+offset[000000000061FD58] offset[2] data[I]
pointer+offset[000000000061FD5C] offset[3] data[M]
pointer+offset[000000000061FD60] offset[4] data[Q]

 

offset 의 크기는 모두 0~4 로 동일하지만 pointer 가 나타내는 주소값이 다른것을 확인할 수 있다.

 

char * 의  경우 offset 1 이 증가하면 address 가 1씩 증가했지만, int * 의 경우 offset 1 이 증가하면 address 가 4씩 증가하는것이 보인다.

 

이는 pointer 가 주소를 나타내는것은 동일하지만 type 에 따라서 해당 type 의 size 만큼 offset address 가 움직이는것을 나타낸다.

 


대부분의 버퍼는 char * 를 많이 사용하지만 type casting 을 통해서 struct * 로 접근을 하는 경우가 있다.

 

이러한 경우 buffer 의 offset 을 이동할때 각별한 주의가 필요하다.

 

 

반응형