다음 코드 :또 다른 C 포인터 질문
int *a;
*a = 5;
가능성이 가장 높은 세그먼트 오류의 결과와 나는 이유를 알 수 있습니다.
다음 코드 :
int a;
*a = 5;
도 컴파일되지 않습니다. (gcc 메시지 : unary *의 잘못된 유형 인수).
이제 포인터는 주소를 저장하기 위해 으로 사용되는 정수입니다.
*a = 5;
이상적으로,이 또한 세그먼트 오류 발생한다 : 그래서, 왜 내가 말한다면 문제가 될 것이다.
포인터는 부호없는 서수 스칼라이며 반드시 정수는 아닙니다. – fortran
일관성/명료성을 위해 세그먼트 오류를 예상하는 것이 이와 같은 상황에서 행동을 생각하는 데 지나치게 정확한 방법은 아니라는 점에 유의해야합니다. 임의의 메모리 주소를 참조 해제하는 것은 C에서 정의되지 않은 동작입니다. 대부분의 경우 세그멘테이션 오류가 발생하지만 필수는 아닙니다. 버스 오류가 발생할 수 있습니다 (Mac OS X은이를 원합니다). 주소가 유효 할 경우 해당 주소의 내용을 제공 할 수 있습니다. –
'C '는 올바르게 초기화되지 않은 포인터를 감지하는 데 어려움이 있지만'int '데이터 유형을 참조 해제하지 않습니다. 그것을 컴파일하는 동안 당신을 멈추게합니다. 그러나 당신은'* (unsigned int *) a = 5'로 그것을 강제 할 수 있고 아마 당신이 기대하는 세분화 오류를 얻을 수 있습니다. 낮은 확률로 'a'는 프로그램 컨텍스트 내에서 주소 지정이 가능한 위치로 변환되는 값을 갖기 때문에 '어쩌면'이라고 말하면서 실수를 놓치지 만 무작위로 주소를 지정하는 미묘한 잘못을 달성하게됩니다. – nik