2009-10-16 7 views
3
unsigned int *pMessageLength, MessageLength; 
char *pszParsePos; 

... 
//DATA into pszParsePos 
... 

printf("\nMessage Length\nb1: %d\nb2: %d\nb3: %d\nb4: %d\n", 
    pszParsePos[1],pszParsePos[2],pszParsePos[3],pszParsePos[4]); 

pMessageLength= (unsigned int *)&pszParsePos[1]; 

MessageLength = *((unsigned int *)&pszParsePos[1]); 

//Program Dies 

출력 :포인터 역 참조 = 프로그램 충돌

 
Message Length 
b1: 0 
b2: 0 
b3: 0 
b4: 1 

나는이 내 프로그램을 충돌하는 이유를 이해하지 못하고 있어요. 누군가 설명 할 수 있을까요, 아니면 적어도 충돌을 일으키지 않을 대체 방법을 제안 할 수 있습니까?

시간 내 주셔서 감사합니다.

+0

당신은 언급하지 않았습니다 : 어떤 운영 체제, 어떤 마이크로 프로세서, 언제 '죽었는지'어떤 오류가 있습니까? –

+0

임베디드 Blackfin 프로세서에서 uClinux의 ansi C를 실행 중입니다. 그것이 "죽을 때"버스 오류 "라고 말하지만, 블랙 핀 주변 장치 중 하나가 적절하게 중지되지 않는 것과 관련이 있다고 생각합니다.하지만 확실히 그것에 대해 잘못 될 수 있습니다. – dunecat

+1

코드를 포맷 할 수 있습니까? –

답변

3

버스 오류는 잘못된 정렬로 데이터에 액세스하려고한다는 것을 의미합니다. 특히, 프로세서가 int을 어느 곳보다 엄격하게 정렬해야하며, *pszParsePos이 정렬되어있는 경우 과 같이 int 경계 (사용자가 초기화하는 방법에 따라 달라 지지만 예를 들어 발생합니다) &pszParsePos[1]은 그렇지 않습니다.

한 가지 방법이 즉, 뭔가

MessageLength = (pszParsePos[1] << 24) | (pszParsePos[2] << 16) | (pszParsePos[3] << 8) | pszParsePos[4] 

(또는이 리틀 엔디안해야하는데 주변의 경우 다른 방법)처럼 명시 적으로 MessageLength를 구성하는 것입니다 해결합니다. 정말로 말장난을하고 싶다면, 접근하고있는 포인터가 올바르게 정렬되어 있는지 확인하십시오.

+0

jk가 나를 때렸지 만, 그는 올바른 방향으로 가고 있습니다. –

+0

정확히 무슨 일이 일어 났습니까. 도와 주셔서 감사합니다! – dunecat

1

다음은 잘못된 것입니다 내가 무슨 생각입니다 :

당신은 당신이 블랙 핀 프로세서에들이받은하는 코멘트 추가. 나는 이것을 몇몇 웹 사이트에서 살펴 보았고 그들은 Blackfin이 이라고 불리는 것을 요구한다고 주장했다.에 액세스했다. 즉, 메모리에 32 비트 값을 읽거나 쓰는 경우 실제 주소는 4 바이트의 짝수 배가되어야합니다.

C의 배열은 [1]이 아니라 [0]으로 색인화됩니다. char의 4 바이트 배열은 요소 [3]로 끝납니다. 당신은 포인터로 변환 1.

  • 은 DWORD로 캐스트는 인덱스에서 시작 것처럼

    • 당신은 치료 32 비트를 통해 :

      코드에서

      , 당신은 문자의 4 바이트의 배열을 메모리 가져 오기.

    4 문자 배열이 4 바이트 경계로 정렬되어 있다고 생각하지만 +1 바이트 위치에서 메모리 액세스를 시작하면 데이터 버스 오류가 잘못 정렬됩니다.

  • +0

    아니요. 문자 배열은 4 바이트보다 훨씬 길며, 원하는 데이터는 인덱스 [1]부터 [4]에 있습니다. 그래도 무슨 뜻인지 알면 도움이됩니다. – dunecat