C 포인터 연산 void - sonkoni/Koni-Wiki GitHub Wiki
보이드 포인터는 자료형이 정해져 있지 않기 때문에 ± 포인터 연산을 할 수 없다.
보이드 포인터를 포인터 연산이 가능하게 하기 위해서는 특정 자료형으로 형변환을 해야 한다.
- C표준 및 MS컴파일러: void 포인터는 포인터 연산 안돼.
- gcc컴파일러: void 포인터를 char, unsigned char 로 해석하여 1바이트 단위로 증감.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
void *ptr = malloc(100);
printf("%p\n", ptr);
printf("%p\n", (int *)ptr + 1);
free(ptr);
return 0;
}
// 0x600001f34000
// 0x600001f34004변수의 자료형을 다른 자료형으로 캐스팅 하면서 그 변수의 값을 변경하는 것은 MS컴파일러 전용이다. 한마디로 비표준다. 이런 형태는 매우 좋지 못하다.
/*** MS컴파일러 전용 **/
void *ptr = malloc(100);
void *ptrNext = ptr;
printf("%p\n", ((int *)ptrNext)++);
printf("%p\n", --(int *)ptrNext);
free(ptr);gcc 등 일반 컴파일러에서 단항증감연산자를 사용하기 위해서는 아래처럼 한다. 가능하면 ± 연산으로 직접 하는 편이 좋다.
/*** 일반컴파일러 **/
void *ptr = malloc(100);
int *ptrNext = ptr; // 캐스팅 해서 변수로 일단 잡아야 아래처럼 증감이 가능함
printf("%p\n", ptrNext++);
printf("%p\n", --ptrNext);
free(ptr);