일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 내셔널지오그래픽 피너스 빅로고 라운드넥 긴팔 티셔츠 카본 블랙
- 굿아이템 양면오픈형 투명 접이식 리빙박스 폴딩박스 옷정리함 수납박스 펜트리수납함
- 1개
- 위드리빙 대용량 옷 수납 방수 바구니
- 삼성 갤럭시워치5
- [제이앤제나] 허리에 무리없는 신생아부터 역류방지쿠션_앨리펀블루 역류방지쿠션
- 미네 리빙다이닝 6인 원목 코너형 식탁세트(소파형)
- 네스파 다야몬드은박 후드티
- ipTIME 유무선공유기
- 긍정
- 톰브라운 명품톰브라운 23SS 더블페이스 니트 아우터형 포켓 셔츠 MJT291A 07545 415
- list #pop #remove #del #append #insert #list형 #파이썬 파이썬 기본 문법 #파이썬 list
- 8052 블랙라인 정사각 세면기
- 잡잡 NBR 요가매트 스탠다드 운동매트 10mm 퍼플
- 샤오미 미밴드 7 스마트밴드
- 봄봄 골드라인 4023G 탑볼세면대 화이트골드 카운타 도기볼 카페세면대
- 두칸 프릴 오버핏 후드티
- 코멧 접이식 투명 리빙박스 56L 대형 2개입
- 오토비 AZ100TR 32G 전후방 FHD 2채널 트럭 화물차 전용 블랙박스 보증기간 2년 20m케이블 포함 후방 적외선 방수 AS 2년보장
- 리빙앤트리 펠리컨 박스 대
- 더블탭스 22SS 정글 01 셔츠 WTAPS JUNGLE 01 GREIGE M
- 22FW 로고 패치 포켓 체크 셔츠 2F000 03 M2359 F41
- 22FW 이바나 빈티지 체크 셔츠 더스트핑크 8054631
- 러버메이드 벤티드 브루트(75L) 원형 컨테이너 리빙박스
- 대림디움 대림바스플랜 PL-3070 탑카운터형 세면대/욕실/화장실/세면도기
- 반스 올드스쿨 VN000D3HY28
- ChatGPT
- 남쪽나무 세면대 세면대 세트 (스마트거울) 벽걸이세면대 이케아세면대 세면기
- 올리비아 스텐 세면대 세트
- 23SS 스트라이프 오버핏 셔츠 723033 V2L30 9066
- Today
- Total
냥집사의 개발일지
C언어 - 메모리 동적 할당 (calloc, realloc) 본문
안녕하세요 오늘은 메모리 동적 할당 2탄 calloc과 realloc에 대해 정리해보겠습니다.
2022.09.20 - [C언어] - C언어 - 메모리 동적 할당 (malloc)
메모리 동적 할당 1탄도 참고하세요~
1. calloc
calloc의 원형 : void *calloc(unsigned int count, unsigned int size);
malloc의 매개변수가 size 1개였던 것과 달리 calloc는 count와 size 2개의 매개변수를 가집니다.
calloc은 (count * size)만큼의 byte를 할당하고 0으로 초기화 한 뒤 시작 주소를 반환합니다.
#include <stdio.h>
#include <stdlib.h>
int main(){
int *pi;
pi = (int *)calloc(5, sizeof(int));
if(pi == NULL){
printf("out of memory");
exit(1);
}
for(int i=0; i<5; i++){
printf("pi[%d] : %d\n",i, pi[i]);
}
free(pi);
return 0;
}
calloc으로 메모리 할당 후 초기화를 따로 하지 않았음에도 0으로 이미 초기화되었음을 확인할 수 있었습니다.
2. realloc
realloc의 원형 : void *realloc(void *p, unsigned int size);
포인터 변수 p가 연결한 영역의 크기를 size 크기의 byte로 조정하고 시작 위치를 반환합니다.
#include <stdio.h>
#include <stdlib.h>
int main(){
int *pi;
int size = 5;
int count = 0;
int num;
pi = (int *)calloc(size, sizeof(int));
if(pi == NULL){
printf("out of memory");
exit(1);
}
while(1){
printf("ONLY input positive num!! : ");
scanf("%d", &num);
if(num <= 0){
break;
}
if(count == size){
size+=5;
pi = (int *)realloc(pi, size * sizeof(int)); //reallocate where pi points (size * sizeof(int) byte -> (size+5) + sizeof(int) byte)
if(pi == NULL){
printf("out of memory");
exit(1);
}
}
pi[count++] = num;
}
for(int i=0; i<5; i++){
printf("pi[%d] : %d\n",i, pi[i]);
}
printf("size of pi points %d\n", _msize(pi));
free(pi);
return 0;
}
1. calloc 함수로 동적 할당한 공간 20(5*sizeof(int))byte를 pi로 가리키게 한다.
2. 무한루프 안에서 양수인 정수를 입력한다. (음수를 입력하면 루프를 벗어난다.)
3. 기존에 할당된 20byte를 넘게 입력이 들어오면 (5개 넘는 정수가 입력되면)
realloc 함수를 이용하여 메모리 공간을 재할당한다.
4. 입력된 정수는 순차적으로 메모리 공간에 할당 된다.
5. _msize 함수는 포인터가 가리키는 공간의 크기를 반환한다.
아래 결과를 보면 1,2,3을 입력하여 처음 할당된 공간 20byte를 초과하지 않으므로
pi가 가리키는 메모리 공간은 여전히 20byte인것을 확인할 수 있습니다.
아래 결과를 보면 1,2,3,4,5,6을 입력하여 처음 할당된 공간 20byte를 초과했으므로 realloc 함수로 재할당 되었습니다.
pi가 가리키는 메모리 공간은 40byte인것을 확인할 수 있습니다.
오늘은 메모리 동적 할당 2탄 calloc과 realloc에 대해 정리해보았습니다.
오늘 예제를 통해 변수의 크기를 알 수 없을 때 왜 동적 할당이 유용한지 알 수 있었습니다.
찾아보진 않았지만 c++의 vector함수도 realloc의 기능을 하는 함수를 포함하고 있지 않을까요?
다음은 동적 할당을 사용하여 문자열 처리에 관한 포스팅을 하고자 합니다.
좋은 하루 보내세요~
감사합니다!!
'C언어' 카테고리의 다른 글
C언어 - 구조체 (struct) (1) | 2022.09.23 |
---|---|
C언어 - 메모리 동적 할당 (문자열) (0) | 2022.09.22 |
C언어 - 메모리 동적 할당 (malloc) (2) | 2022.09.20 |
C언어 - void 포인터 (void Pointer) (0) | 2022.09.19 |
C언어 - 함수 포인터 (Function Pointer) (0) | 2022.09.18 |