2011-01-31 3 views
1

참고 : C는 Microsoft C 컴파일러입니다.calloc을 사용한 후 C 액세스 위반

다음 코드에 문제가 있습니다.

*Roomsize = (int*)calloc(sizeof(int),sched->numberOfRooms); 

roomIndex = 0; 
for(roomIndex=0; roomIndex< sched->numberOfRooms; roomIndex++) 
{ 
    fscanf(inputFile,"%d",&lineInput); 
    numberOfLinesRead++; 
    *Roomsize[roomIndex] = lineInput; 
} 

이것은 별도의 C 파일에 있습니다. 나는 이것을 유지 보수하기 위해 물건들을 분리하기로 결정할 때까지이 문제를 안고 있었고, 나는 포인터가 섞여있는 것 같았다.

calloc이 제대로 작동합니다.

루프의 첫 번째 반복에서 roomIndex의 요소 0이 올바르게 설정됩니다.

그러나 루프의 두 번째 요소 (요소 1)는 항상 런타임에 액세스 위반이 발생합니다.

나중에이 코드는 2 차원 배열로 실행되지만이 문제는 정확히 똑같은 문제이며 이는 가장 간단한 경우입니다.

왜 아무 것도 설정할 수없는 이유를 이해하는 데 도움을 줄 수 있습니까?

답변

5

*Roomsize[roomIndex]*(Roomsize[roomIndex])과 동일합니다. (*Roomsize)[roomIndex]라고 말하고 싶습니다.

(나는 Roomsize 실제로 int**입니다 있으리라 믿고있어. 그건 정확하지의 경우 다른 곳에 문제가 거짓말을 할 수 있습니다.)

+0

이렇게했습니다. 괄호는 실제로 무엇을 의미합니까? – RekrowYnapmoc

+0

귀하의 가정은 정확합니다. – RekrowYnapmoc

+0

대괄호는 일반적인 배열 액세스 연산자입니다. 작업 순서에 따라 포인터 액세스가 취소되기 전에 배열 액세스가 발생합니다. –

0

첫 선을, 당신은 Roomsize를 할당 할 때, 잘못된 보인다. Roomsize가 int *이라고 가정 할 때 정확하다면 Roomsize = (int *) calloc...이라고 말해야합니다. @Daniel이 게시 할 때 별표를 없애기 위해 과제도 변경해야합니다.

+0

아니, 생각하는대로 괜찮아. (그렇지 않으면 나는 그것이 컴파일러를 지나치지 않을 것이라고 가정하고있다). Daniel은 Roomsize가 int **라는 가정하에 정확합니다. 파일 밖에서 int *로 선언되고 포인터를 통해 전달됩니다. 따라서 필자는 먼저 그것을 역 참조하고 있습니다. 그래도 도움을 주셔서 감사합니다. – RekrowYnapmoc