2011-04-28 2 views
2

file1.c에서다음 코드로 인해 가비지 또는 액세스 위반 오류가 발생하는 이유는 무엇입니까?

int a[3]={1,39,7}; /* definition */ 

와 file2.c

extern int a[]; /* declaration */ 
b = a[2]; /* correct usage in file2.c */ 

파일 2의 사용은 제 3 요소를 취득

extern int *a; /* another declaration */ 
c = a[1]; /* a[1] is *(a+1), fails! */ 

file3.c (7)의, 그러나 사용 file2에서 39를 주소로 해석합니다 (32 비트 정수 및 주소로 가정). 이로 인해 가비지 또는 액세스가 발생합니다. iolation 오류가 왜 그렇게 ...?

+1

@ user692209 서식을 지정하지 않고 텍스트 블록을 붙이기보다는 [코드 형식에 대한 FAQ] (http://meta.stackexchange.com/q/22186)를 읽으십시오. – razlebe

답변

7

C FAQ에서 this answer을 확인하십시오. int *aint a[]은 동일하지 않습니다.

편집

: 이 대답에서 수정 된 항목 :

하나 개의 소스 파일에서 당신은 int 배열을 정의하고 다른 당신이하는 int에 대한 포인터를 선언했다. [...] type-to-type-T는 array-of-type-T와 같지 않습니다.

편집 # 2 : 어떤 일이 발생하는지 보려면 this answer을 확인하십시오. 샘플에 맞게 수정 관련 부품 :

2 [인 file2.c에 은] (시작) 명명 된 객체 지난 곳입니다 동안 file3.c1 []는 a가 가리키는 객체를지나 한 곳입니다.

따라서 file3.c에서는 a가 역 참조되는 포인터라고 생각합니다. 실제로는 배열 자체이기 때문에 다른 곳으로 역 참조되어 액세스 위반이 발생합니다.

+1

+1. 어쩌면 거기에서 인용문을 추가 할 수 있습니다. – MByD

+0

+1 for the faq. 엄청나게 유용한 문서. –

+0

답변 해 주셔서 감사합니다. – user1754940

관련 문제