unsafe 영역안에서 포이터를 사용하는건 스택으로 데이터를 저장하는 값형식의 변수에서만 가능합니다. 참조형식의 변수에서 포인터를 사용할 수 없는 이유는 참조형식의 데이터는 힙에 할당되고 힙은 가비지 컬렉터에 의해 위치가 바뀔 수 있기 때문입니다. 결국 참조형식의 주소를 갖고 있던 포인터는 언제라도 전혀 엉뚱한 곳을 가리킬 수 있기 때문입니다.
fixed는 힙에 할당된 참조 형식의 인스턴스를 가비지 컬렉터가 건드리지 못하게 하여 위에서 말한 문제를 해결할 수 있도록 합니다.
static void Main()
{
unsafe {
string s = "abcdefg";
fixed (char* c = s.ToCharArray()) {
for (int i = 0; i < s.Length; i++)
Console.WriteLine(*(c + i));
}
}
string 형은 참조형으로 값을 힙에 할당합니다. 이 string형의 시작주소를 포인터 c에 할당할때 fixed를 사용하므로서 string형인 s 인스턴스의 힙주소는 고정될 것입니다.
출처: http://lab.cliel.com/entry/C-fixed?category=478966 [CLIEL LAB]
STACK / QUEUE (0) | 2018.06.29 |
---|---|
람다식 (LAMBDA EXPRESSION) (0) | 2018.06.29 |
문자열 보간($) (0) | 2018.06.29 |
nameof (0) | 2018.06.29 |
dynamic (0) | 2018.06.29 |