: Ideone에SIGSEGV를 기대하지만 일 정상 점점
#include<stdio.h>
int main()
{
int a[][2][3]={0,1,2,3,4,5,6,7,8,9,10,11,12};
int i=-1;
int d;
d=a[i++][++i][++i];
printf("%d\n",d);
return 0;
}
및 런타임 오류를 기대했지만 의외로 코드가 잘 작동 CodeBlocks, Dev C++ 및 Ideone.
내게 따르면 모든 메모리 주소는 런타임에 컴파일러에 의해 다음 방정식에 의해 해결됩니다. a [i] [j] [k] = ( (* (a + i) + j) + k) 모든 컴파일러는 먼저 내부 괄호, 다음 내부 괄호 등을 해결해야합니다.
따라서 주어진 라인
d=a[i++][++i][++i];
으로 해결해야합니다 또한
d=*(*(*(a+i++)+ ++i)+ ++i)
에 의해, http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm 이
가장 안쪽의 괄호가 먼저 해결되어야한다 (주 2 참조하시기 바랍니다) 값은 a-1이어야하고 i는 0이됩니다. 따라서 우리는 메모리에 접근하려고 시도 할 때 SIGSEGV 에러를 얻어야합니다. 컴파일러가 표시해도 여전히 세 컴파일러 모두에 출력이 표시됩니다. 이것을 설명해주십시오.
정의되지 않음 ......... – devnull