खोज…


असुरक्षित कोड का परिचय

जब यह unsafe संशोधक द्वारा चिह्नित किया जाता है, तो कोड ब्लॉक के एक फ़ंक्शन में सूचक चर का उपयोग करने की अनुमति देता है। असुरक्षित कोड या अनवांटेड कोड एक कोड ब्लॉक है जो पॉइंटर वैरिएबल का उपयोग करता है।

पॉइंटर एक वैरिएबल है जिसका मान दूसरे वेरिएबल का पता है यानी मेमोरी लोकेशन का डायरेक्ट एड्रेस। किसी भी चर या स्थिर के समान, आपको किसी भी चर पते को संग्रहीत करने के लिए इसका उपयोग करने से पहले एक सूचक घोषित करना होगा।

सूचक घोषणा का सामान्य रूप है:

type *var-name;

मान्य सूचक घोषणाएँ निम्नलिखित हैं:

int    *ip;    /* pointer to an integer */
double *dp;    /* pointer to a double */
float  *fp;    /* pointer to a float */
char   *ch     /* pointer to a character */

निम्न उदाहरण सी # में संकेत के उपयोग को दिखाता है, असुरक्षित संशोधक का उपयोग करते हुए:

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();
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया गया था, तो यह निम्नलिखित परिणाम उत्पन्न करता है:

Data is: 20
Address is: 99215364

संपूर्ण पद्धति को असुरक्षित घोषित करने के बजाय, आप कोड के एक हिस्से को भी असुरक्षित घोषित कर सकते हैं:

// safe code
unsafe
{
    // you can use pointers here
}
// safe code

एक पॉइंटर का उपयोग करके डेटा मान को पुनः प्राप्त करना

आप पॉइंटरिंग () पद्धति का उपयोग करके पॉइंटर चर द्वारा संदर्भित डेटा पर संग्रहीत डेटा को पुनः प्राप्त कर सकते हैं। निम्न उदाहरण यह प्रदर्शित करता है:

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 को बढ़ा सकते हैं क्योंकि यह मेमोरी में तय नहीं किया गया है, लेकिन मेमोरी में एक सरणी पता तय है, और आप इसे नहीं बढ़ा सकते।

इसलिए, यदि आपको पॉइंटर चर का उपयोग करके एक सरणी डेटा तक पहुंचने की आवश्यकता है, जैसा कि हम पारंपरिक रूप से सी, या सी ++ में करते हैं, तो आपको निश्चित कीवर्ड का उपयोग करके पॉइंटर को ठीक करने की आवश्यकता है।

निम्न उदाहरण यह प्रदर्शित करता है:

using System;
namespace UnsafeCodeApplication
{
   class TestPointer
   {
      public unsafe static void Main()
      {
         int[]  list = {10, 100, 200};
         fixed(int *ptr = list)
         
         /* let us have array address in pointer */
         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

यदि आप विजुअल स्टूडियो आईडीई का उपयोग कर रहे हैं, तो आपको प्रोजेक्ट गुणों में असुरक्षित कोड का उपयोग करने की आवश्यकता है।

यहाँ छवि विवरण दर्ज करें

यह करने के लिए:

  • समाधान एक्सप्लोरर में गुण नोड को डबल क्लिक करके प्रोजेक्ट गुण खोलें।
  • बिल्ड टैब पर क्लिक करें।
  • "असुरक्षित कोड की अनुमति दें" विकल्प चुनें


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow