2010-07-03 3 views
12

안전하지 않은 코드의 제한 사항은 C#입니까? 예를 들어, C 또는 C++을 사용하는 것처럼 사실상 임의의 포인터 캐스트 및 산술을 수행 할 수 있습니까?C#의 안전하지 않은 코드

답변

11

예. 안전하지 않은 상태 인 경우 All bets are off

검증 할 수있는 유형의 "안전성"이 제거되었으며 런타임이 없으면 한 유형의 포인터에서 다른 유형의 포인터로 변환 할 수 있습니다. shooting yourself in the foot 그래서 욕망 - C 또는 C++과 매우 비슷합니다. 여기

는 C#으로 다른 포인터 타입을 사용의 예 : 배열의 유형 Byte[]입니다

fixed (Byte* dstBytes = &currentImage[0]) 
{ 
    var dstBuffer = (Int64*)dstBytes; 
    const int blockCount = ImageSizeInBytes/sizeof(Int64); 

    for (var j = 0; j < blockCount; j++) 
    { 
     dstBuffer[j] = srcBuffer[j]; 
    } 
} 

참고,하지만 난 Byte*를 얻을 후 나는 Int64*에 캐스팅과에서 8 바이트로 작업 할 수 있습니다 시각.

+0

+1 링크 용으로 (그리고 좋은 대답). – Sam

1

예, 원하는 곳에 포인터를 지정할 수 있습니다.

그러나 프로그램이 가상 주소 공간에서 실행 중이므로 해당 공간에 실제로 존재하는 메모리에만 액세스 할 수 있습니다. 즉, 다른 프로세스에 액세스 할 수 없으며 ' t 할당되었습니다.

0

당신은 자세한 내용은 다음 페이지를 참조 할 수 있습니다

http://msdn.microsoft.com/en-us/library/y31yhkeb.aspx

안전하지 않은 코드는 거의 모든 원시 변수 (기본 유형) 포인터를 선언 할 수있는 기능을 제공합니다; 당신은 포인터 타입들 사이에서 캐스트 할 수 있습니다. 포인터 산술은 포인터 유형의 저장소 크기를 기반으로하므로 포인터에 후 증가 또는 후 감소를 적용하면 sizeof (유형)에 따라 주소가 증가합니다.

3

예, 가능합니다. MSDN의 Unsafe Code Tutorial은 다음과 같습니다.

이 모든 것을 사용하는 방법은 끔찍한 생각입니다. 예,하지만 이유가 있습니다. 저는 최근에 (처음으로) Byte *을 반환 한 타사 API를 통해 웹캠 데이터를 가져와야했습니다.

관련 문제