@templatetypedef가 맞습니다. 그는 대답에 나를 때렸다. 정의되지 않은 동작이 반드시 segfault를 의미하는 것은 아닙니다.
그러나 나는 그것이 N = 9 세그먼테이션 폴트 (segfault)에 대한 이유와 같은 몇 가지 추측을 제공하고 싶지만 8. 일반적으로는, int i
및 int arr[]
같은 변수가 아래로 성장하는의 stack에 있지. 따라서 i
은 주소가 0x4000
일 수 있으며, 4 바이트 인 경우 int
인 경우 arr[0]
은 0x4004
, arr[1]
은 0x4008
등입니다. 이 경우 컴파일러는 arr
에 대해 16 바이트를 할당했을 가능성이 높으며 주소가 0x4014
(첫 번째 바이트는 arr
, 즉 arr[5]
의 첫 번째 바이트) 미만일 수 있습니다. 하지만 일반적으로 수동으로 선언하는 변수 외에도 스택에 다른 것들이 있습니다. 예를 들어 printf
호출에 대한 인수가 스택에 있고 다른 부기 정보가있을 수 있습니다. 따라서 arr[9]
이 컴파일러에서 다른 용도로 사용하는 스택 위치와 일치하면 segfault로 이어질 수있는 실수로 해당 정보가 손상됩니다.
또는 arr[8]
이 OS에서 할당 된 스택 프레임의 맨 아래에있는 경우 OS는 사용자의 프로세서가 arr[9]
과 일치하는 주소에서 값을로드하거나 저장하라는 명령을 실제로 거부하도록 프로세서를 구성했을 것입니다. 스택 크기는 일반적으로 4KB 정도이므로이 시나리오는 불가능하다고 생각합니다. 그런 짧은 프로그램의 경우 할당 된 스택의 끝 부분에 아무 것도 없어야합니다.
배열 끝을 지나서 읽는 것은 정의되지 않은 동작입니다. 정의되지 않은 동작은 아무 것도 될 수 없습니다. * 반드시 * segfault하지 않아도됩니다. – Cairnarvon
순수한 행운. 쓰레기 번호를 출력하지 않니? – Humungus
다른 지역화 된 라이더 ... : '( –