C++ 배열에서 데이터를 초과하여 입력한다면?
2022. 4. 28. 22:57ㆍC++
아래의 코드는 정상적으로 작동된다.
#include <iostream>
using namespace std;
int main(void)
{
int *ptr = new int[3](); //힙 공간에 동적으로 int형 배열을 할당한다.
for(int i = 0; i<7; i++) // 할당된 공간을 초과하여 값을 넣는다.
ptr[i] = i; //ptr[0]~ptr[6]에 0부터 6까지 집어 넣는다.
for(int i = 0; i <7; i++)
cout<<ptr[i]<<" "; //ptr[0]~ptr[6]를 출력한다.
//결과: 0 1 2 3 4 5 6
cout<<endl;
for(int i = 0; i <7; i++)
cout<<&ptr[i]<<" "; //ptr[0]~ptr[6]의 주솟값을 확인한다.
//결과: 0xfe19b0 0xfe19b4 0xfe19b8 0xfe19bc 0xfe19c0 0xfe19c4 0xfe19c8
//마치 연속된 공간이 할당된 것처럼 보인다!
delete[] ptr;
return 0;
}
분명 코드에서는 동적으로 int형으로 3만큼의 공간만 할당하였다.
그런데 결과를 보면 정상적인 배열처럼
int[0]~int[6]까지 정상적으로 값이 넣어지고, 출력된 것을 알 수 있다.
또한 주솟값을 확인했을 때 연속된 메모리 공간임을 확인할 수 있다.
사실 조금만 생각해보면
ptr[0] | *(ptr+0) == *(0xfe19b0 + 0*4byte) == *(0xfe19b4)
ptr[1] | *(ptr+1) == *(0xfe19b0 + 1*4byte) == *(0xfe19b8)
.
.
.
ptr[6] | *(ptr+6) == *(0xfe19b0 + 6*4byte) == *(0xfe19c8)
과 같은 의미이므로, 당연한 결과라고 생각할 수 있다.
직접적으로 주솟값에 값을 넣은 것이고,
그 주솟값에 넣었던 값을 주솟값을 통해 빼낸것이니 말이다.
하지만 이렇게 사용하면 안 되는 이유가 있다.
우리가 결과적으로 할당한 공간은 int[3]만큼이다.
즉, 우리가 직접적으로 할당한 공간은 ptr[0]~ptr[2]까지다.
그렇기 때문에 나머지 주소공간은 언제든지 할당 가능한 영역이 되어버린다.
따라서 데이터의 손실이 발생할 수 있다.
'C++' 카테고리의 다른 글
HEAP COURRUPTION DETECTED 에러 (0) | 2022.05.04 |
---|---|
precision, fixed (0) | 2022.04.25 |
깊은 복사 / 얕은 복사 (0) | 2022.04.18 |
explicit (0) | 2022.04.18 |
copy constructor (0) | 2022.04.16 |