내가 다음 메모리 위치 안에 무엇인지보기 위해 증가하는 잘못된 포인터가 있다고 가정합니다. 내 코드는 오류나 문제없이 잘 작동합니다. 나는이 메모리 위치의 내용을 출력한다. 내 화면에 출력을 볼 수 있습니다. 이러한 메모리 위치 중 일부는 0 값을 가지며, 다른 값은 패턴에 정렬 된 것처럼 보이는 큰 음수 또는 양수를 포함합니다. 그러나 이러한 메모리 위치의 내용을 변경하거나 덮어 쓰려고하면 어떻게됩니까? 그들은 무엇을 대표합니까? 어떤 종류의 데이터가이 메모리 위치에 저장 될 수 있으며 이러한 메모리 위치가 충분히 변경되면 운영 체제를 중단 할 수 있습니까?C++에서 범위를 벗어난 포인터의 역 참조를 변경하는 것이 안전합니까?
#include <iostream>
using std::cout;
using std::endl;
int main() {
int num1 = 5;
int* bad_ptr = &num1;
cout << "Address of num1: " << &num1 << endl;
cout << "Dereference bad pointer: " << *bad_ptr << endl;
// The bad pointer acesses 500 memory addresses
for (int i = 0; i < 500; i++) {
bad_ptr++;
cout << "Dereference bad pointer: " << *bad_ptr << endl;
// What if I try to change it?
// *bad_ptr = 1;
}
return 0;
}
정의되지 않은 동작은 정의되지 않았습니다. 이 특정 시간에 특정 컴파일러 버전이 특정 최적화 수준 및 특정 OS 버전의 플래그로 무엇인지 파악할 수 있지만 의미있는 것은 배울 수 없습니다. – nwp
"운영 체제, 프로그램 유형 및 하드웨어 아키텍처에 따라 이러한 메모리 위치가 충분히 변경되는 경우 운영 체제를 중단 할 수 있습니다. 최신 CPU는 하나의 프로세스가 다른 프로세스를 손상시키지 않도록 보호하며 운영 체제는 아마도 이점을 얻습니다. 커널 드라이버에서 이것을 수행하면 좋지 않을 수 있습니다. OS를 응용 프로그램과 분리하지 않고 단순한 메모리 관리 모델을 갖춘 마이크로 컨트롤러에서이를 수행하십시오. 그렇다면 OS가 밟힐 수 있습니다. – user4581301
컴파일러는 정의되지 않은 동작이 유효한 프로그램에서 발생하지 않는다고 가정합니다. 따라서 프로그램에서 멀리 떨어져있는 부분을 최적화 할 수 있습니다. 아니면 그렇지 않을 수도 있습니다. 또는 실제로 메모리 위치에 저장된 값이 아닐 수도 있습니다. 0이 인쇄 될 수도 있습니다. – user463035818