- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 코딩문제
- 파이썬
- 쉬운 파이썬
- 파이썬3
- 파이썬 강의
- python 중간고사
- 파이썬 입문
- 알고리즘
- python data structure
- 셀레니움
- 기말시험
- 프로그래밍
- 중간시험
- 알고리즘 강의
- 알고리즘 강좌
- 파이썬 강좌
- c언어
- 대학시험
- 파이썬 자료구조
- gdrive
- selenium
- Crawling
- 코딩시험
- 면접 파이썬
- 자료구조 강의
- 파이썬활용
- 파이썬 알고리즘
- 채용문제
- 크롤링
- 자료구조
반원 블로그
[C 프로그래밍] 동적 메모리_2.sizeof 응용 본문
이전 포스팅 : http://gosmcom.tistory.com/11
#1 sizeof연산자를 통한 동적 메모리 할당!
sizeof에 A를 넘겨주면 A의 크기를 반환해준다.
sizeof(자료형이름) => 자료형의 크기 sizeof(변수이름) => 변수의 자료형의 크기
즉 int a 의 크기는 sizeof(int) 또는 sizeof(a)가 가능하다.
보통 전자를 많이 사용한다.후자는 연결리스트에 필요한 동적할당에서 구조체의 크기를 구할 때의 sizeof를 빗대어 생각해보자.
#2 왜 굳이 sizeof를 써서 동적 할당을 해야되는가?
이전 포스팅에서 '컴파일러에 따라 자료형 bit가 다르다'는 것을 사례로 들었다.
이번에는 실제 코드를 비교해 살펴보도록 하자.
▶A의 코드 ideone 확인하기
#include <stdio.h> #include <stdlib.h> int main(void) { int *value; value = (int*)malloc(4); *value = 100; printf("value : %d\n", *value); }
▶B의 코드 ideone확인하기
#include <stdio.h> #include <stdlib.h> int main(void) { int *value; value = (int*)malloc(sizeof(int)); *value = 100; printf("value : %d\n", *value); }
보통 출력값도 같고 정상적으로 작동하겠지만 아래와 같은 문제가 발생할 수 있다.
- int 이외의 자료형일 때에는 A 코드가 비정상 동작 할 수 있다.
- 32비트, 64비트 이외의 컴파일러로 컴파일하면 A 코드가 비정상 동작될 수 있다.(예: 16비트 컴파일러)
- 16비트 컴파일러로 컴파일했을 때 불필요하게 2바이트의 메모리가 낭비되는 소스코드가 된다.
이에 반해 B코드는 상수대신 sizeof 연산자를 썼기에, 여러가지 컴파일러 환경에서 모두 적절하게 사용할 수 있는 소스코드가 되었다.
#3 동적 메모리 사용시 주의할 점
- 정확한 크기의 메모리를 할당 받아야 한다
- 사용자가 할당한 동적 메모리는 사용자가 직접 시스템에 반환해야 한다.( JAVA같이 메모리 관리를 자동으로 해주는 언어는 제외한다)
▶ 만일 사용이 끝난 메모리를 시스템에 반환하지 않는다면?
시스템은 사용자가 메모리를 계속 사용하는 줄 알고 계속 유지한다. (메모리 누수, Memory Leak)
▶ 임시적으로 필요한 메모리를 malloc 으로 계속 해서 할당 받고 반환하지 않는다면?
사용하지 않는 메모리가 늘어나 메모리 부족으로 프로그램을 더 이상 사용할 수 없는 상태가 된다.
//동적 메모리 해제 #include <stdlib.h> //필요한 헤더파일 void free(메모리주소); //사용하는 함수
즉 메모리 누수를 방지하려면 할당과 해제는 항상 같이 사용해야한다.
연습 3_1
#include <stdio.h> #include <stdlib.h> int main(void) { int *value; value = (int*)malloc(sizeof(int)); //메모리 할당 *value = 100; printf("value : %d\n", *value); free(value); //메모리 해제, free하지 않으면 메모리 누수가 발생한다. }
#4 동적 메모리 배열
지금까지 동적 메모리와 할당, 해제를 배웠으니 동적 메모리 배열을 만들어보자
- 배열의 길이만큼 메모리 공간을 malloc으로 얻어낸 후 사용한다
- '배열의 길이*자료형의 크기' 만큼의 메모리를 얻어서 사용한다.
연습 4_1 - 동적 메모리 공간에 배열을 선언하고 그 공간을 사용하는 프로그램 (ideone확인하기)
#pragma warning(disable 4996) #include <stdio.h> #include <stdlib.h>//동적 메모리 사용을 위한 헤더 선언 int main(void) { int count, input, i; //프로그램에서 사용할 변수 선언 int *array; //동적 배열에 사용할 포인터 선언 printf("원하는 배열의 길이 : "); scanf("%d", &count); //배열 길이를 count 변수에 저장 array = (int*)malloc(sizeof(int) * count); // 'int의 사이즈*count' 만큼 메모리 할당, int형으로 지정 //배열에 사용자가 입력한 값을 저장 for(i=0;i<count;i++){ printf("%d 번째 수 입력 : " , i); scanf("%d",&input); *(array+i)=input; } //배열에 저장된 값 출력 for(i=0; i<count; i++){ printf("*(array+%d) = %d\n", i, *(array+i)); } free(array); }
//입력: 5 4 3 2 1 5 일때의 출력 결과 *(array+0) = 4 *(array+1) = 3 *(array+2) = 2 *(array+3) = 1 *(array+4) = 5
#5 동적 메모리 정리
- 필요한 헤더 파일 : #include <stdlib.h>- 동적 메모리 할당
함수 원형 : void* malloc(사용할 메모리 양) 사용 예 : int *ptr; ptr = (int *)malloc(sizeof(int));
- 동적 메모리 해제
함수 원형 : void free(메모리주소); 사용 예 : free(ptr);
- 동적 메모리 할당에 필요한 자료형의 크기 구하기
sizeof(자료형이름) = 자료형의 크기sizeof(변수이름) = 변수의 자료형의 크기
- 할당된 동적 메모리 사용시 주의점
사용자가 할당한 동적 메모리는 free 함수를 통해 반환해야 한다. 그렇지 않으면 메모리 누수현상이 일어난다.
'2017 > C 프로그래밍' 카테고리의 다른 글
[C 프로그래밍] 구조체_1.기본이론 (0) | 2017.02.26 |
---|---|
[C 프로그래밍] 동적 메모리_4.실습_연결리스트1(Linked List) (0) | 2017.02.25 |
[C 프로그래밍] 동적 메모리_3.이론_연결리스트1(Linked List) (0) | 2017.02.24 |
[C 프로그래밍] 동적 메모리_1.기본이론 (0) | 2017.02.21 |
[C 프로그래밍] 파일 출력 함수_3.연결 리스트 저장, 불러오기 (0) | 2017.02.19 |
[C 프로그래밍] 파일 출력 함수_2.바이너리 모드 (0) | 2017.02.19 |
[C 프로그래밍] 파일 출력 함수_1.기본 (0) | 2017.02.17 |
[C 프로그래밍] 파일 입력 함수 (0) | 2017.02.17 |