2011-02-09 4 views

답변

7

기술적으로 100 % 합법적이지는 않지만 reinterpret_cast<unsigned char*>(buf)을 사용할 수 있습니다.


이 100 % 기술적 정당하지 않은 이유는, 객체에 대한 포인터가 명시 적으로의 객체에 대한 포인터로 변환 될 수있는 제

섹션 5.2.10 expr.reinterpret.cast 탄에 기인 다른 유형. 원래 유형이 원래 포인터 값을 산출하면 포인터 변환 결과는 지정되지 않습니다.

나는 *reinterpret_cast<unsigned char*>(buf) = 'a'이 지정되지 않았지만 *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a'은 괜찮습니다.

+0

내가 올바르게 기억하면 [[un] signed] char에 대한 포인터를 사용하여 모든 유형의 객체의 메모리에 액세스하는 것이 합법적이라는 예외가 있습니다. 나는 당신의 코드의 행동을 잘 정의했다고 생각한다. – HolyBlackCat

+0

@HolyBlackCat 나는 그러한 문구를 기억하지 못한다. 참고 자료를 제공 할 수 있다면 대답을 업데이트 할 것이다. – Motti

+0

Unforunately 표준 참조를 찾을 수 없습니다. 그러나 나는 'char *'에 대한 엄격한 앨리어스 (aliasing) 규칙에 대한 예외가 있다는 SO에 대한 몇 가지 주장을 발견했다. ("[un] signed char에 대한 포인터를 사용하여 모든 유형의 객체의 메모리에 접근하는 것은 합법적이다. "). See this : http://stackoverflow.com/a/99010/2752075'앨리어싱 <...>에 char *를 사용할 수 있습니다. 이 규칙은 char * (signed char 및 unsigned char 포함)에 대한 예외를 허용합니다. char *는 다른 유형의 별칭이라고 항상 가정합니다. 그러나 이것은 다른 방식으로는 작동하지 않습니다. 구조체에 chars.x의 버퍼를 별명으로 지정하지 않는다는 의미입니다. – HolyBlackCat

4

그냥 캐스팅 하시겠습니까?

unsigned char *conbuf = (unsigned char *)buf; 
+4

C++에서는 "그냥 캐스트하십시오"는 항상 면책 조항이 필요합니다. – tenfour

+0

Heh-heh! 면책 조항 :이 답변은 질문에 표시되는 텍스트에 적합합니다. 부호있는 8 비트 숫자의 배열에서 사용하지 마십시오. – Dave

관련 문제