앞서 우리가 배웠던 내용을 다시 보자.
코드로 살펴보자.
왼쪽의 그림 같은 경우에 const
를 사용하지 않고 변수를 선언했다. 배열 안에 값을 넣기 위해선 compile time에 값이 정해져 있어야 하는데, 왼쪽의 그림같은 경우에는 그렇지 않다. 실행이 되지 않은 채라면 length에는 쓰레기 값이 들어 있는 상황이다. 그렇기 때문에 const
를 사용하여 고정된 값이 들어갈 수 있도록 바꿔주어야 complie이 문제가 없다고 얘기를 한다.
#include<iostream>
using namespace std;
int main()
{
int length;
cin >> length;
int *array = new int[length]{11, 22, 33, 44, 55, 66, 77};
array[0] = 1;
array[1] = 2;
for (int i = 0; i < length; i++)
{
cout << (uintptr_t)&array[i] << endl;
cout << array[i] << endl;
}
delete [] array;
//int array[length];
return 0;
}
output : 7
13598144
1
13598148
2
13598152
33
13598156
44
13598160
55
13598164
66
13598168
77
저번까지는 new 와 delete를 어떻게 사용했는지 배웠다면, 조금더 응용인 배열에 대한 new와 delete에 대해 알아보자. new같은 경우에는 동적할당으로 사용하는데, 이는 자료형 size에 맞춰서 os에게 메모리르 받아오고 그 메모리의 주소를 우리에게 알려준다고 했다. 그래서 new를 사용하면 항상 주소를 받을 수 있는 포인터 변수로 받아주어야 한다. 모르면 전 장을 다시 한번 복습하고 오자.
여기서 보아야 할 것은 uniform initalize도 했다는 것이다. 사용자가 7을 입력하면 uniform initialize를 통해 제대로 출력이 된다. 하지만 7보다 작은 값을 넣으면 runtime error가 발생한다. 그 이유는 이미 7보다 작은 값에 대한 메모리만 os로부터 받아와서 값을 넣어 놨는데, 나머지는 무엇이냐에 대해 우리에게 묻는 것이다. 즉, 이미 os로부터 유저가 넣은 값까지는 os로부터 빌려왔는데 나머지 값은 빌려오지 않아 실제 메모리를 사용하는 공간에도 그 이후 값이 들어가 충돌나는 경우가 있으므로 runtime error가 발생한다.