2017-02-17 12 views
-2

내 개발 환경은 ARM OMAP Sitata 용 g ++ 크로스 컴파일러로 구성됩니다. 부호없는 INT의 *에 부호없는 INT를 추가 할 때 나는 간단한 포인터 연산의 이상한 뉘앙스를 발견로는 다음과 같습니다부호없는 int를 부호없는 int에 추가 *

unsigned int* dst_base_addr; 
unsigned int* dst_addr; 
unsigned int dst_offset; 

간단히

(부호없는 INT *)에 (부호없는 int)를 추가하려고
dst_addr = dst_base_addr + dst_offset; 

하나가 순진하게 생각하지만, 실제로 구제로 적절한 형식 변환을 수행하는 과정이다 다음 해당 결과

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + (dst_offset << 2)); 

을 생산 하듯이 위의 해석되지 않습니다 다음과 같습니다.

dst_addr = (unsigned int*)((unsigned int)dst_base_addr + dst_offset); 

질문 :이 상황에서 적절한 유형 변환이 필요한 이유는 무엇입니까?

+0

실수를 피하십시오. –

+0

dst_addr에 메모리를 할당하지 않고'dst_addr = dst_base_addr + dst_offset; '가 좋지 않습니다. –

+0

'dst_addr = (unsigned int *) ((unsigned int) dst_base_addr + dst_offset);하지만 잘못된 포인터 연산이 작동하지 않습니다 – SingerOfTheFall

답변

7

위의 하나는 순진하게 생각하는 것으로 해석하지만 실제로 C (그리고 아마도 C++)에 해당하는 결과 다음

포인터 산술 물건의 크기가 가리키는 단위로 수행을 생산하지 않습니다. int*에 n을 추가하면 int을 나타내는 데 필요한만큼의 바이트가 추가됩니다. 즉, int이 32 비트 인 경우 4 * n (대부분의 일반 아키텍처에서는 4 바이트)입니다.

이것은 표준 C 동작입니다.