void* block = ::operator new(n*size);
int i;
for(i = 0;i<BLOCK_SIZE -1;i++){
*(unsigned int*)((unsigned int)block + n*i) = (unsigned int)block + n*(1+i);
}
*(unsigned int*)((unsigned int)block + n*i) = 0;
प्रश्न> मैं उपरोक्त कोड का अर्थ नहीं समझ पा रहा हूँ। ऐसा लगता है कि मेमोरी का एक ब्लॉक अगले ब्लॉक मेमोरी की ओर इशारा कर रहा है।
क्या कोई कृपया मुझे यह समझा सकता है?
2 जवाब
block[0] = &block[1]
block[1] = &block[2]
block[2] = &block[3]
.
.
.
block[n] = 0 // dereferenced so not NULL, assigned zero as a value
AFAIS, यह शुरुआत से अंत तक अगले तत्व की ओर इशारा करता है। भले ही उपरोक्त प्रदर्शन इतना सरल लगता है, यह कोड के पीछे का तर्क है।
block[i] = &(block[i+1])
करने का एक कच्चा प्रयास। (ध्यान दें कि ओपी के कोड में =
के दाहिने हाथ के ऑपरेंड को संदर्भित नहीं किया गया है)
आपने इसे काफी हद तक सही पाया है - यह स्मृति का एक ब्लॉक आवंटित कर रहा है, फिर इसे कई नोड्स के रूप में देख रहा है, और उन्हें एक साथ लिंक्ड सूची के रूप में जोड़ रहा है।
जैसा कि यह अभी खड़ा है, यह काफी व्यर्थ दिखता है, क्योंकि यह नोड्स के बीच लिंक के साथ डेटा रखने के लिए कोई मेमोरी आवंटित नहीं करता है (ठीक है, शायद यह करता है - शायद n
वास्तव में इससे बड़ा है sizeof(unsigned *)
और size
, BLOCK_SIZE
से बड़ा है, इसलिए इसमें बड़े आइटम शामिल हो सकते हैं)।
अगर मैं ऐसा कुछ करने जा रहा था, तो शायद मैं इस तरह से कोड लिखूंगा:
unsigned *block = (unsigned *)::operator new(n*size);
for (size_t i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = nullptr;
बेशक, ऐसा करने का कोई कारण नहीं है, यह भी काफी संदिग्ध है - अधिकांश कोड शायद कुछ इस तरह से ठीक होगा:
std::vector<unsigned *> block(size);
for (int i=0; i<size-2; i++)
block[i] = &block[i+1];
block[size-1] = 0;
char*
के बजाय unsigned*
को क्यों डालना चाहिए?
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
void*
पर अंकगणितीय संक्रियाओं को पूर्ववत नहीं कर सकते। मूल प्रोग्रामर ने अंकगणित की अनुमति देने के लिए सब कुछunsigned int
पर डाल दिया और फिर उसे वापस पॉइंटर्स पर डाल दिया। ध्यान दें किstd::uintptr_t
पॉइंटर को स्टोर करने के लिए सही पूर्णांक प्रकार है .void *block = new unsigned int[n]
हो सकता है, यह मानते हुएsize == sizeof(unsigned int)