C# 튜토리얼login
C# 튜토리얼
작가:php.cn  업데이트 시간:2022-04-11 14:06:23

C# 안전하지 않은 코드



C#에서는 코드 블록이 unsafe 수정자로 표시된 경우 함수에서 포인터 변수를 사용할 수 있습니다. 안전하지 않은 코드 또는 관리되지 않는 코드는 포인터변수를 사용하는 코드 블록입니다.

포인터 변수

포인터는 값이 다른 변수의 주소, 즉 메모리 위치의 직접 주소인 변수입니다. 다른 변수나 상수와 마찬가지로 포인터를 사용하여 다른 변수의 주소를 저장하기 전에 포인터를 선언해야 합니다.

포인터 변수 선언의 일반적인 형식은 다음과 같습니다.

type *var-name;

다음은 유효한 포인터 선언입니다.

int    *ip;    /* 指向一个整数 */
double *dp;    /* 指向一个双精度数 */
float  *fp;    /* 指向一个浮点数 */
char   *ch     /* 指向一个字符 */

다음 예에서는 C#에서 unsafe 수정자가 사용될 때 포인터의 사용을 보여줍니다.

using System;
namespace UnsafeCodeApplication
{
    class Program
    {
        static unsafe void Main(string[] args)
        {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is: {0} ",  var);
            Console.WriteLine("Address is: {0}",  (int)p);
            Console.ReadKey();
        }
    }
}

위 코드가 is 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Data is: 20
Address is: 99215364

전체 메서드를 안전하지 않은 코드로 선언할 필요는 없고 메서드의 일부만 안전하지 않은 코드로 선언할 필요가 있습니다. 다음 예에서는 이 점을 보여줍니다.

포인터를 사용하여 데이터 값 검색

ToString() 메서드를 사용하여 포인터 변수가 참조하는 위치에 저장된 데이터를 검색할 수 있습니다. 다음 예에서는 이를 보여줍니다.

using System;
namespace UnsafeCodeApplication
{
   class Program
   {
      public static void Main()
      {
         unsafe
         {
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is: {0} " , var);
            Console.WriteLine("Data is: {0} " , p->ToString());
            Console.WriteLine("Address is: {0} " , (int)p);
         }
         Console.ReadKey();
      }
   }
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Data is: 20
Data is: 20
Address is: 77128984

포인터를 메서드 매개 변수로 전달

포인터 변수를 메서드 매개 변수로 메서드에 전달할 수 있습니다. 다음 예에서는 이를 보여줍니다.

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe void swap(int* p, int *q)
      {
         int temp = *p;
         *p = *q;
         *q = temp;
      }

      public unsafe static void Main()
      {
         TestPointer p = new TestPointer();
         int var1 = 10;
         int var2 = 20;
         int* x = &var1;
         int* y = &var2;
         
         Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
         p.swap(x, y);

         Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
         Console.ReadKey();
      }
   }
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10

포인터를 사용하여 배열 요소에 액세스

C#에서 배열 이름과 배열 데이터에 대한 포인터는 다음과 같은 포인터를 갖습니다. 동일한 데이터 유형은 다른 변수 유형입니다. 예를 들어 int *p와 int[] p는 서로 다른 유형입니다. 포인터 변수 p는 메모리에 고정되어 있지 않기 때문에 증가시킬 수 있지만 배열 주소는 메모리에 고정되어 있으므로 배열 p를 증가시킬 수 없습니다.

따라서 포인터 변수를 사용하여 배열 데이터에 액세스해야 하는 경우 C 또는 C++에서 일반적으로 수행하는 것처럼 fixed 키워드를 사용하여 포인터를 수정할 수 있습니다.

다음 예에서는 이를 보여줍니다.

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)

         /* 显示指针中数组地址 */
         for ( int i = 0; i < 3; i++)
         {
            Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
            Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
         }
         Console.ReadKey();
      }
   }
}

위 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

안전하지 않은 코드 컴파일

안전하지 않은 코드를 컴파일하려면 명령줄로 전환해야 합니다. 컴파일러 /unsafe 명령줄을 지정합니다.

예를 들어 안전하지 않은 코드가 포함된 prog1.cs라는 프로그램을 컴파일하려면 명령줄에 다음 명령을 입력하세요.

csc /unsafe prog1.cs

Visual Studio IDE를 사용하는 경우 프로젝트 속성에서 안전하지 않은 코드를 활성화해야 합니다.

단계는 다음과 같습니다.

  • 솔루션 탐색기에서 속성 노드를 두 번 클릭하여 프로젝트 속성을 엽니다.

  • Build 탭을 클릭하세요.

  • "안전하지 않은 코드 허용" 옵션을 선택하세요.

PHP 중국어 웹사이트