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;

प्रश्न> मैं उपरोक्त कोड का अर्थ नहीं समझ पा रहा हूँ। ऐसा लगता है कि मेमोरी का एक ब्लॉक अगले ब्लॉक मेमोरी की ओर इशारा कर रहा है।

क्या कोई कृपया मुझे यह समझा सकता है?

c++
2
q0987 12 अप्रैल 2017, 00:51
2
आप void* पर अंकगणितीय संक्रियाओं को पूर्ववत नहीं कर सकते। मूल प्रोग्रामर ने अंकगणित की अनुमति देने के लिए सब कुछ unsigned int पर डाल दिया और फिर उसे वापस पॉइंटर्स पर डाल दिया। ध्यान दें कि std::uintptr_t पॉइंटर को स्टोर करने के लिए सही पूर्णांक प्रकार है .
 – 
François Andrieux
12 अप्रैल 2017, 00:54
1
यह भी ध्यान दें कि यह मानक C++ में अपरिभाषित व्यवहार है; इसके अनुरूप होने के लिए आवंटन void *block = new unsigned int[n] हो सकता है, यह मानते हुए size == sizeof(unsigned int)
 – 
M.M
12 अप्रैल 2017, 00:56
क्या यह किसी सार्वजनिक/खुले स्रोत कोड का हिस्सा है?
 – 
Daniel Jour
12 अप्रैल 2017, 01:20
हां। आप सही हैं।
 – 
q0987
13 अप्रैल 2017, 16:59

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, यह शुरुआत से अंत तक अगले तत्व की ओर इशारा करता है। भले ही उपरोक्त प्रदर्शन इतना सरल लगता है, यह कोड के पीछे का तर्क है।

0
snr 12 अप्रैल 2017, 01:23
बल्कि block[i] = &(block[i+1]) करने का एक कच्चा प्रयास। (ध्यान दें कि ओपी के कोड में = के दाहिने हाथ के ऑपरेंड को संदर्भित नहीं किया गया है)
 – 
Daniel Jour
12 अप्रैल 2017, 01:19

आपने इसे काफी हद तक सही पाया है - यह स्मृति का एक ब्लॉक आवंटित कर रहा है, फिर इसे कई नोड्स के रूप में देख रहा है, और उन्हें एक साथ लिंक्ड सूची के रूप में जोड़ रहा है।

जैसा कि यह अभी खड़ा है, यह काफी व्यर्थ दिखता है, क्योंकि यह नोड्स के बीच लिंक के साथ डेटा रखने के लिए कोई मेमोरी आवंटित नहीं करता है (ठीक है, शायद यह करता है - शायद 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;
0
Jerry Coffin 12 अप्रैल 2017, 02:18
प्रश्न> हमें char* के बजाय unsigned* को क्यों डालना चाहिए?
 – 
q0987
13 अप्रैल 2017, 17:02