2014-12-22 2 views
2

포인터에 할당 된 값의 역 참조 문제가 있습니다. 내가 해제 참조를 위해 값을하려고 할 때 다음과 같이 반대 논리를 사용하여, 지금C/C++ 이중 포인터 de-referencing 문제

void encode(int32_t *pInput, unsigned char **ppOutput) 
{ 
    **(int32_t **)ppOutput = *(int32_t*)pInput; 
    *ppOutput += sizeof(int32_t); 
} 

: 다음

void decode(unsigned char **ppInput, int32_t *pOutput) 
{ 
    *(int32_t *)pOutput = **(int32_t**)ppInput; 

    *ppInput += sizeof(int32_t); 
} 



*(int32_t *)pOutput = **(int32_t**)ppInput; 

*(int32_t *)pOutput 

잘 작동 다음 함수를 고려

에는 가비지가 포함되어 있지만 로직을 변경하면

*(int32_t *)pOutput = **ppInput; 

1,515,다음

*(int32_t *)pOutput 

정확한 값을 포함한다.

단서가없는 부분을 안내해주세요.

+2

나는 플라네타륨 내부보다 더 많은 별을보고 있습니다. 게시물에서 강조 표시를 사용하지 마십시오. 코드가보기보다 혼란스럽게 보입니다. – PaulMcKenzie

+1

역 참조 측면에서 나는 다소 확신하고있다 :'** (int32_t **) ppInput'은 실제로는 * (int32_t *) (* ppInput)이어야한다. * 실제 * [MCVE] (https://stackoverflow.com/help/mcve)에서 * 실제 * 코드를 보는 것은 이것을 해결하는 데 긴 길을가집니다. – WhozCraig

+0

왜 그런 짓을 한거야? 하지마. –

답변

1
*(int32_t *)pOutput = **(int32_t**)ppInput; 

당신은 int32_t* 포인터로 unsigned char*에 포인터를 캐스팅. 즉, unsigned char 바이트의 메모리 위치에서 int32_t 바이트의 크기를 읽는 것입니다. 따라서 확실하게 쓰레기 값을 sizeof(int32_t) > sizeof(unsigned char)으로 줄 것입니다.

개체 포인터를 다른 형식의 개체 포인터로 명시 적으로 변환 할 수 있습니다. "T1에 대한 포인터"유형의 prvalue v가 "cv T2에 대한 포인터"유형으로 변환 될 때 T1 및 T2가 모두 표준 레이아웃 유형이고 T2의 정렬 요구 사항이 static_cast (static_cast (v)) 인 경우 결과는 static_cast T1보다 더 엄격하거나 두 유형 중 하나가 무효 인 경우. "pointer to T1"유형의 prvalue를 "pointer to T2"유형 (여기서 T1 및 T2는 객체 유형이고 T2의 정렬 요구 사항은 T1보다 더 엄격하지 않음)로 변환하고 원래 형식으로 되돌려 원래 포인터 값. 그러한 다른 포인터 변환의 결과는 지정되지 않습니다.

+0

나는 잠시 동안 그것을보고 있었다. 내 직감은 정의되지 않은 행동입니다. 나는 컴파일러 경고가 그것에 대해 말해야 만하는 것이 무엇인지 궁금해한다 ... 그는 아마 그것을 피하기 위해'memmove'를 사용해야한다. ... – jww

+0

네, 이것으로 손에 컴파일러가 뭔가를 방출 할 것이라고 생각한다 ... – ravi

+0

OK,하지만 난 (Encode 함수에서) ppOutput이 디코드 함수에서 ppInput으로 전달 될 때 위에 언급 된 이유가 문제가되어야한다고 생각하지 마십시오. ppputput가 char 배열에 대한 포인터를 가리키고 있다고 가정하면 크기는 4000 바이트입니다. 예 : 서명되지 않은 문자 테스트 [4000]; unsigned char * pEnc = test; unsigned char ** ppOutput = &pEnc; –