C++ 배열에서 데이터를 초과하여 입력한다면?

2022. 4. 28. 22:57C++

아래의 코드는 정상적으로 작동된다. 

#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