질문과 답변
소프트웨어 c++에서 배열 크기 초과해도 값이 할당되네요?
2020.05.11 22:20
아래의 프로그램을 컴파일하면 배열 크기를 초과한 공간에 값이 저장되어 있어서 컴파일이 안될 것 같은데 정상적으로 컴파일됩니다. 더욱 놀라운 것은 프로그램을 실행하면 0.84가 정상적으로 출력됩니다. 왜 그럴까요? 참고로 윈도는 아니고 우분투에서 g++로 컴파일했습니다. 윈도가 아니라서 죄송합니다.
#include <iostream>
int main()
{
long long int length3 = 4294967294;
double *array3 = new double[length3];
std::cout << "I just allocated an array of integers of length " << length3 << '\n';
array3[4294967805] = 0.84;
printf("%f\n", array3[4294967805]);
delete[] array3;
return 0;
}
솔직히 여기서 할만한 얘기는 아닌거 같은데...
굳이 얘기를 해보자면,
동작은 되지만, 자기 것이 아닌 메모리 공간을 건드려서 심각한 에러를 유발할 수 있습니다.
숫자만 굳이 불려서 생각할거 없이
array 크기가 3이라고 하면 0,1,2 의 인덱스만 가질 수 있겠지만,
인덱스 3,4 같은 인덱스에 값을 넣거나 읽어도 읽어집니다.
왜냐하면 거기도 메모리공간은 있으니까요.
단순히 읽기만 한다면 어지간해서는 아예 문제 안생기는데요,
거기에 값을 할당하면 문제가 될 수 있습니다.
다른곳에서 쓰고있던 곳을 건드렸을수도 있으니까요.
기본적으로 쓰레기 값이 들어있거나 다른곳에서 쓰던 값이 들어있습니다.
근데 C/C++에서는 그런걸 점검 안하는데
다른 언어에서는 인덱스 범위 벗어나면 대개 에러 뿜습니다.
그냥 언어특성이니까 그러려니 해야죠.