*(int *)ptr = number; 는 어떤 뜻인가요? 라는 문자를 받았습니다.

포인터, 이해되다가도 어렸지요?


*(int *)ptr = number; 에서 (int *)처럼 타입 변환을 했다면, 아마도 number는 int 변수이고

ptr은 int형 포인터가 아닌 것으로 생각합니다.


그렇다면 *(int *)ptr = number; 가 의미하는 것은 무엇일까요?

우선 C언어에서 크기가 다른 변수의 대입에 대한 규칙을 먼저 이해해야 합니다.

작은 변수에서 큰 변수로 대입하는 것은 문제가 없습니다.

예를 들어 char a 값을 int number에 넣는 것은 자연스럽죠.

문제는 int number에서 char a로 대입할 때입니다.

C언어에서는 다른 언어와 다르게 char이라고 해서 문자만 넣는 것이 아닙니다.

정확히는 변수의 크기를 지정한다고 생각하는 것이 이해하기 쉽습니다.


즉, char a는 한 바이트짜리 변수를 정의하는 것이고

int nubmer는 4 바이트짜리 변수를 말합니다.


한 바이트짜리의 값을 4 바이트에 넣는 것은 자연스럽지만,

4 바이트 값을 한 바이트 변수에 넣으려면 하는 수 없이 

4 바이트 중 하위 바이트 하나의 값만 대입할 수 밖에 없습니다.


포인터 변수도 마찬가지입니다.

char *ptr 이라고 선언했다면, 한 번에 대입되는 값은 한 개의 바이트 값입니다.

그래서 주소값을 증가하기 위해 ptr++ 하면 주소 값이 하나 씩 증가하지요.


int *ptr이라고 선언했다면, 한 번에 대입되는 값은 4 개의 바이트 값입니다.

주소값을 증가하기 위해 ptr++ 하면 주소 값을 +4로 증가하지요.


만일 ptr이 char * 이고 nubmer이 int 라면,


     *ptr = number;


이라고 대입하면 number값이 256 이상일 때는 버그가 발생합니다.


      *(int *)ptr = number;


이라고 해야 제대로 number 값이 대입됩니다. 당연히 ptr은 4바이트 이상의 공간을 가지고 있어야겠습니다.

char    *p_char   = malloc( 1024);
int      n_number = 0x12345678;

*p_char = n_number;

printf( "(int *)p_char= 0x%x\n", *(int *)p_char);

*( int *)p_char = n_number;

printf( "(int *)p_char= 0x%x\n", *(int *)p_char);

위 코드를 실행하면 아래와 같이 출력됩니다.

]$ ./o.out
(int *)p_char= 0x78
(int *)p_char= 0x12345678
]$