Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 심도
- 저장소와 동적메모리
- Digital Slow Shutter
- 변수
- 고정비트레이트
- Zoom Lense
- 변수의 초기화와 대입
- Gain
- 과초점거리
- c언어
- C Mount
- 아이리스
- ASCCII
- 이미지센서
- 카메라
- Depth of Fileld
- 간단한 앱만들어보기
- camera
- 실생활알고리즘
- AppInventer
- CS Mount
- 렌즈
- image sensor
- 프로그래머스 lv2
- 무게선별자동화
- Patch Cleaner
- 조건 제어문
- 저조도
- main 함수 인자 전달
- Pixel Bit Format
Archives
- Today
- Total
카메라 개발자 공부방(SW)
[20장] void 포인터 본문
반응형
오늘은 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는 발생하지 않아 문제가 없는 코드입니다.
하지만 다음의 코드는 문제가 발생합니다.
#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