int main()
{
int *a; // a = 0x4053c6 (a random address)
// this will cause the program to exit, and how do i know this memory can't be written ?
*a = 5;
return 0;
}
혼란스러워! 나는이 스 니펫이 항상 프로그램이 충돌하도록 유도 할까? 그리고이 프로그램이 처음부터 끝까지 실행할 수있는 경우가 있습니까?C++의 임의 메모리 블록에 쓸 때 예외를 잡는 방법
직접 추적해야합니다. 이 경우'a'가 초기화되지 않았다는 것을 알기 때문에 포인터 값을 읽는 것은 정의되지 않은 동작입니다 (참조 된 위치에 쓰지 않고). – GManNickG
'a'가 초기화되지 않았다는 것을 알고 있습니다. 그리고 대부분의 심사관은 경고를 발표 할 것입니다. 그러나'* a = 5'를 실행할 기회가 있는지 알고 싶습니다. – Ggicci
@Ggicci : 그렇습니다. 정의되지 않은 동작은 어떤 일이 발생할 수 있음을 의미합니다. 야생 일치가있을 수 있다면 'a'는 예를 들어 따라서 자신의 주소와'* a'는 (프로그램을 알고있는 OS가 알고있는 한) 쓸 수있는 유효한 장소입니다. 그럼에도 불구하고'a'가 자신의 주소를 갖고 있으면 작동 할 것이라고 보장하지 않습니다 ... 정의되지 않은 동작에 대해서는 아무 것도 보장되지 않습니다. 다른 무해한 가능성도 있습니다. 'a'는 현재 사용되지 않는 스택 공간을 쉽게 가리킬 수 있습니다. –