[C] 타입 Types / Type Casting / 가변 인자
``c <stdint.h>``를 사용하도록 하자.
``c int``보다 ``c uint8_t`` 같은 고정 크기 타입을 사용하는 것이 좋다.
``c char``보다 ``c TCHAR``를 사용하는 것이 좋다. 윈도우인 경우 컴파일 옵션에 따라 리눅스 등에서도 호환 가능하기 때문.
Types
```c
uintptr_t
```
(void *)
```
size_t
```
Type Casting
타입 캐스팅을 적절히 해주지 않으면 계산에서 오류가 발생한다. 특히 포인터가 그렇다.
``c printf()``할 때도 마찬가지.
source :
```c
chunk0_ptr[1] = (uint64_t) &chunk0_ptr - (3*sizeof(uint64_t));
printf("chunk0_ptr[1] : %p / &chunk0_ptr - 3 : %p\n",
chunk0_ptr[1], &chunk0_ptr - (3*sizeof(uint64_t)));
```
result :
```
chunk0_ptr[1] : 0x602050 / &chunk0_ptr - (3*sizeof(uint64_t)) : 0x601fa8
```
이런 식으로 대입할 때와 같은 값을 출력하도록 했는데 다른 값이 출력되는 이유는,
``c &chunk0_ptr``은 주소이므로 ``c -1`` 당 ``c -8``이 되기 때문. ( 64bit OS )
따라서 ``c - (3*sizeof(uint64_t)) ==> - 8*(3*sizeof(uint64_t))`` 이 되어버린다.
이를 방지하려면 대입할 때와 동일하게 형변환을 해주거나, 형변환을 하지 않으려면 ``c -3``만 빼주어야 한다.
```
chunk0_ptr[1] : 0x602050 / (uint64_t) &chunk0_ptr - 3*(sizeof(uint64_t)) : 0x602050
chunk0_ptr[1] : 0x602050 / &chunk0_ptr - 3 : 0x602050
```
~0u
가변 인자
- 가변 인자 함수를 만들기 위해서는 `` stdarg.h``가 필요하다.
- 반드시 1개 이상의 고정 파라미터가 있어야 한다.
- `` ...``은 파라미터 가장 뒤에 위치해야 한다.
const
const type *ptr / type * const ptr
```c
int a = 3;
int b = 5;
const int *ptr = &a;
ptr = &b; // right
*ptr = 10; // error
```
``c const int``를 가리키는 포인터. 따라서 ``c *ptr``을 수정할 수 없다.
이 때 가리키고 있는 대상이 ``c const``가 아니어도, ``c ptr``로 접근하는 경우는 수정 불가능하다.
```c
int a = 3;
int b = 5;
int * const ptr = &a;
ptr = &b; // error
*ptr = 10; // right
```
``c int *``를 가리키는 ``c const`` 포인터. 따라서 ``c ptr``을 수정할 수 없다.
'Languages & Frameworks > C C++' 카테고리의 다른 글
[C] File IO : open, fopen, setbuf / fd VS fp (0) | 2017.10.12 |
---|---|
[C] File IO : mmap - memcpy family (0) | 2017.10.09 |
[C/C++] define, inline, const, enum, enum class (0) | 2017.09.04 |
[C] the end of the address space check (0) | 2017.07.27 |
malloc/calloc tip, wrapper (0) | 2017.07.12 |