Programming/.NET

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 인스턴스의 힙주소는 고정될 것입니다.

'Programming > .NET' 카테고리의 다른 글

[C#] BinaryFormatter / XmlSerializer / DataContractJsonSerializer  (0) 2018.06.26
[C#] Encoding / BitConverter  (0) 2018.06.19
[C#] fixed  (0) 2018.06.13
[C#] DateTime  (0) 2018.05.29
[C#] 생성자와 소멸자  (0) 2018.05.23
[C#] 개체의 생성과 해제  (0) 2018.05.15
0 0