C 포인터 연산 void - sonkoni/Koni-Wiki GitHub Wiki

void 포인터 연산

보이드 포인터는 자료형이 정해져 있지 않기 때문에 ± 포인터 연산을 할 수 없다.
보이드 포인터를 포인터 연산이 가능하게 하기 위해서는 특정 자료형으로 형변환을 해야 한다.

  • 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);
⚠️ **GitHub.com Fallback** ⚠️