본문 바로가기
{Programing}/C.C++

c/c++ 배열, 동적할당

by 탱타로케이 2020. 1. 6.

배열 : 같은 자료형의 연관된 변수들을 하나로 묶어서 사용하는 자료구조.

 

ex) int 형 배열

1 2 3 4 5 6 7 8 9

char 형 배열

h e l l o

 

배열의 선언 및 초기화

변수명 뒤에 대괄호를 쓰고 그 안에 배열의 크기를 작성한다.

초기화는 중괄호에 콤마로 구분하여 작성하고.

추후에 배열 요소에 인덱스로 접근하여 값을 변경할 수 있다.

int arr[5] = {1,2,3,4,5};



int arr2[10];

for(int i=0; i>10; ++i)
{
	arr2[i] = i; 
}

 

배열의 인덱스

 

배열을 사용할 때는 인덱스로 접근하는 방법과, 포인터 연산을 이용해 접근하는 방법이 있다.

인덱스란 배열의 각 요소를 가리키는 번호로 배열의 요소수가 n 개라면 인덱스의 범위는 0부터 n-1 까지이다.

변수명만 작성하면 배열의 시작 주소를 반환하고

* 를 같이 작성하면 포인터가 가리키는 데이터의 값을 반환하는 것과 마찬가지 효과를 보여준다.

변수명뒤에 대괄호와 함께 인덱스를 작성하면 값이 바로 반환된다.

 

인덱스를 사용할때는 범위를 넘어가는 요소를 찾으면 컴파일 에러가 발생하지만,

포인터 연산은 컴파일 에러는 아니지만 쓰레기 값이 반환된다.

arr[1] = 10;

printf("%d\n", arr);

printf("%d\n", *arr);

printf("%d\n", *(arr+1));

printf("%d\n", arr[3]);

printf("%d\n", arr[4]);

 

동적할당

프로그램 실행중에 메모리를 할당하는 것을 이야기한다.

변수들은 기본적으로 컴파일 단계에서 메모리의 스택영역에 저장된다.

동적할당한 변수들은 실행단계에서 크기가 정해지며 프로세스 메모리의 힙 영역에 저장된다.

 

동적할당된 변수는 메모리를 임의대로 잡은 것이기 때문에 프로그래머가 명시적으로 동적할당을 해제하지 않으면 프로그램 종료전까지 메모리를 계속 사용중인 것으로 잡혀있게 된다. 메모리 누수라고 칭한다.

프로그래머가 실수하면 메모리가 모자라 컴퓨터가 비정상 종료될 가능성이 생긴다.

 

포인터 동적할당을 이용한 가변 배열

 

미리 정해진 크기의 배열이 아닌 필요한 크기만큼 필요할 때 만들어서 사용할 배열이 필요한 경우가 발생한다.

그럴때 사용할수 있는것이 동적할당을 이용한 가변배열이다.

 

정리 : 동적할당은 힙(Heap)영역에 저장된다. 자동으로 메모리 반환이 되지 않는다. 명시적으로 해제 해야만한다.

크기를 자료형 1개 크기로 하면 변수 하나. 여러개 하면 배열 처럼 사용가능하다. 2차배열, 3차배열도 가능하다.

//C 버전.
int* pArr;

//동적할당
//(저장할 자료형의 포인터)malloc(생성할 크기) 
pArr = (int *)malloc(sizeof(int)*4);

//동적할당 해제
free(pArr);


//C++ 버전
int * pArr2;

//[] 연산자 있으면 배열, 없으면 변수
//동적 할당. new 자료형[길이]
pArr2 = new int[4];

//동적 할당 해제
delete [] pArr2;


//C++11 버전
int * pArr3;

//동적 할당. new 자료형[길이] {초기화할 값들.}
pArr3 = new int[4] {1,2,3,4};

//동적 할당 해제
delete [] pArr3;

 

 

 

'{Programing} > C.C++' 카테고리의 다른 글

c/c++ enum, preprocesser  (0) 2020.01.06
c/c++ const 예약어  (0) 2020.01.06
c/c++ 구조체 / 클래스 (3)  (0) 2020.01.03
c/c++ 구조체 / 클래스 (2)  (0) 2020.01.03
c/c++ 구조체 / 클래스 (1)  (0) 2020.01.02

댓글