카메라 개발자 공부방(SW)

[20장] void 포인터 본문

Langauge/C

[20장] void 포인터

luckmart 2021. 10. 9. 21:40
반응형

오늘은 void*에 address type에 대해 공부를 해보겠습니다.
address type이 void*란 의미는 어떠한 형식의 address type도 저장시킬 수 있다는 걸 의미합니다.
(다시 말하면 int*, int**, char* 이든 모두 저장시킬 수 있다는 의미인데요.)

이것이 왜 필요할까요?

malloc을 생각해봅시다. malloc()은 heap 영역에 메모리 공간을 할당하고 그 시작 주소를 반환하는데요. 이 반환 type 또한 void*입니다!
(익숙하지 않으시다면 저장소와 동적 메모리 파트를 꼭 복습해주세요.)
메모리의 반환은 void* 이지만 프로그래머가 원하는 목적에 따라 메모리 type을 지정해서 사용할 수 있었습니다.

컴퓨터 입장에선 메모리를 할당 했지만 사용자가 어떠한 address type으로 사용할지 모르기 때문에 프로그래머에게 맡긴 것입니다.

이럴 때 void* 사용되기도하고

정말 아무 type의 pointer를 저장시켜야 될 때에도 void*가 사용됩니다.

다음 예제를 보시죠!

#include <stdio.h>
#include <malloc.h>

int main()
{
    void* ptr = malloc(4);

    int* pn = (int*)ptr;
    *pn = 16;
    printf("%d\n", *pn);

    char* pc = (char*)ptr;
    *pc = 'C';
    printf("%c\n", *pn);

    float* pf = (float*)ptr;
    *pf = 3.141592f;
    printf("%f\n", *pf);

    free(ptr);
    return 0;
}
// 실행결과
// 16
// C
// 3.141592

 

heap에 할당된 메모리의 address type을 프로그래머가 원하는 데로 변경해서 사용한 예제입니다.
address type이 4보단 크지 않기 때문에 overflow는 발생하지 않아 문제가 없는 코드입니다.

void 포인터를 용도에 따라 사용한 메모리 그림


하지만 다음의 코드는 문제가 발생합니다.

#include <stdio.h>
#include <malloc.h>

int main()
{
    void* ptr = malloc(4);

    int* pn = (int*)ptr;
    *pn = 16;
    printf("%d\n", *pn);
    printf("%d\n", *ptr); // compile error occur

    free(ptr);
    return 0;
}

 

참조하는 메모리를 어떤 data type으로 read 할지 모르기 때문에 에러입니다~(ptr은 void*)

자 오늘은 여기까지

'Langauge > C' 카테고리의 다른 글

[22장] 재귀함수  (0) 2021.10.11
[21장] 함수 포인터  (0) 2021.10.10
[19장] 2차원 배열  (0) 2021.10.08
[18장] 구조체  (0) 2021.10.07
[17장] 동적메모리와 저장소  (0) 2021.10.06
Comments