की तरह एक स्मृति आवंटन समारोह/ऑपरेटर से आते हैं "अपसंदर्भन" एक सूचक सूचक अंक के मूल्य तक पहुँचने का मतलब है। मान लें निम्नलिखित घोषणाओं:
int a = 10;
int *p = &a;
यहाँ दो चर का एक काल्पनिक स्मृति नक्शा है:
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
a 0x80001000 0x00 0x00 0x00 0x0A
p 0x80001004 0x80 0x00 0x10 0x00
a
पूर्णांक मान से 10 p
a
(0x80001000) के पते शामिल हैं। अगर हम a
p
के माध्यम से dereferencep
इंडिकेशन ऑपरेटर *
के साथ सामग्री तक पहुंचना चाहते हैं। इस प्रकार, अभिव्यक्ति *p
अभिव्यक्ति a
के बराबर है।
#include <stdlib.h>
#define N 20 // For this example, we will allocate 20 strings
#define LENGTH 10 // of 10 characters each (not counting 0 terminator)
...
char **arr = malloc(sizeof *arr * N);
if (arr)
{
size_t i;
for (i = 0; i < N; i++)
{
arr[i] = malloc(sizeof *arr[i] * (LENGTH + 1));
strcpy(arr[i], " ");
}
}
: यदि हम
a = 16;
लेखन के रूप में
*p = 16;
ही है कि लिखा है यहाँ कैसे प्रकार char **
की एक वस्तु का उपयोग करने के तार की एक सरणी बनाने के लिए दिखा कोड का एक लघु स्निपेट है
लाइन के माध्यम से लाइन के माध्यम से जाना,
char **arr = malloc(sizeof *arr * N);
एन तत्वों का एक ब्लॉक आबंटित करता है, पर्याप्त प्रत्येक बड़े एक सूचक चार करने के लिए (sizeof *arr
== sizeof (char *)
*arr
== char *
के प्रकार के बाद से) स्टोर करने के लिए, और arr
के परिणामस्वरूप सूचक मूल्य प्रदान करती है। IOW, arr
पहले पॉइंटर को char
पर इंगित करता है, इसलिए char **
टाइप करें। ध्यान दें कि यदि आप घोषणा और समारोह कॉल अलग हो गए, यह नहीं क्या arr
अंक की तरह
char **arr;
...
arr = malloc(sizeof *arr * N);
हम arr
को malloc
का परिणाम प्रदान करना चाहते हैं लगेगा,।
if (arr)
यह malloc
विफल करने के लिए संभव है, इसलिए हम इसे उपयोग करने से पहले परिणाम की जांच करना चाहते। घटना में malloc
विफल रहता है यह एक पूर्ण सूचक मूल्य वापस करेगा।
{
size_t i;
for (i = 0; i < N; i++)
{
arr[i] = malloc(sizeof *arr[i] * (LENGTH + 1));
हर किरदार के सूचक arr[i]
के लिए, हम स्मृति काफी बड़ी लंबाई + 1 तत्वों के लिए, पर्याप्त प्रत्येक बड़े एक char
मूल्य धारण करने के लिए के एक ब्लॉक का आवंटन (sizeof *arr[i] == sizeof (char)
, *arr[i] == char
के प्रकार के बाद से, ध्यान दें कि sizeof (char)
हमेशा होता है 1) और परिणाम arr[i]
पर असाइन करें।
चूंकि हम अलग-अलग malloc
कॉल के साथ प्रत्येक स्ट्रिंग आवंटित करते हैं, यह संभावना नहीं है कि वे स्मृति में सम्मिलित हैं। यहाँ एक और स्मृति एक संभव उपरोक्त कोड का परिणाम दिखा नक्शा है: "। * P1 == ग, अर्थात अपसंदर्भन p1 हमें/से पढ़ा ग लिखने के लिए अनुमति देता है"
Item Address 0x00 0x01 0x02 0x03
---- ------- ---- ---- ---- ----
arr 0x80001000 0xA0 0xCC 0x00 0x00
...
arr[0] 0xA0CC0000 0xA0 0xCC 0x20 0x00
arr[1] 0xA0CC0004 0xA0 0xCC 0x20 0x40
arr[2] 0xA0CC0008 0xA0 0xCC 0x21 0x28
...
arr[19] 0xA0CC0014 0xA0 0xCC 0x23 0x10
...
arr[0][0] 0xA0CC2000 ' ' ' ' ' ' ' '
arr[0][4] 0xA0CC2004 ' ' ' ' ' ' ' '
arr[0][8] 0xA0CC2008 ' ' ' ' 0x00 0x??
...
arr[1][0] 0xA0CC2040 ' ' ' ' ' ' ' '
arr[1][4] 0xA0CC2044 ' ' ' ' ' ' ' '
arr[1][8] 0xA0CC2048 ' ' ' ' 0x00 0x??
...
क्षमा करें मैं एक नौसिखिया हूँ, इसलिए मैं गलत हो सकता हूं, लेकिन आवंटन के बाद पूरी तरह से साफ करने के लिए, आपको स्ट्रिंग्स और फ्री एआर की कुल संख्या के माध्यम से लूप करना होगा [i ] साथ ही पूरे सरणी मुक्त (एआर) को मुक्त करना, क्या यह सही है? या यह सिर्फ 'मुक्त (एआर) के लिए पर्याप्त होगा; '? –