मैं कुछ के लिए malloc का उपयोग कर एक कोड लिख रहा था और फिर एक मुद्दा का सामना करना पड़ा तो मैं एक परीक्षण कोड है जो वास्तव में पूरी भ्रम जो नीचे है ::गतिशील स्मृति आवंटन मुद्दे
# include <stdio.h>
# include <stdlib.h>
# include <error.h>
int main()
{
int *p = NULL;
void *t = NULL;
unsigned short *d = NULL;
t = malloc(2);
if(t == NULL) perror("\n ERROR:");
printf("\nSHORT:%d\n",sizeof(short));
d =t;
(*d) = 65536;
p = t;
*p = 65536;
printf("\nP:%p: D:%p:\n",p,d);
printf("\nVAL_P:%d ## VAL_D:%d\n",(*p),(*d));
return 0;
}
Output:: [email protected]:~/Desktop/ad/A1/CC$ ./test
SHORT:2
P:0x9512008: D:0x9512008:
VAL_P:65536 ## VAL_D:0
का सार लिखा था मैं malloc का उपयोग कर स्मृति के 2 बाइट आवंटित कर रहा हूं। मॉलोक जो लौटाता है एक शून्य * सूचक एक शून्य * सूचक 'टी' में संग्रहीत किया जाता है।
उसके बाद 2 पॉइंटर्स घोषित किए गए हैं पी - पूर्ण प्रकार का पूर्णांक प्रकार और डी। तो मैंने उन दोनों को टी * (पी = टी और डी = टी) * का मतलब है कि दोनों डी & पी ढेर पर एक ही ज्ञापन स्थान पर इंगित कर रहे हैं।
65536 (2^16) से (* डी) को बचाने की कोशिश करने पर मुझे चेतावनी मिलती है कि बड़े int मान को छोटा कर दिया जाता है। अब मैंने फिर से 65536 (2^16) से (* पी) बचाया जिसने कोई चेतावनी नहीं दी।
* प्रिंटिंग (* पी) और (डी) पर मुझे अलग-अलग मान मिलते हैं (हालांकि प्रत्येक निर्धारित परिभाषित सूचक प्रकार के लिए सही है)।
मेरा प्रश्न हैं:
हालांकि मैं ढेर मेम malloc का उपयोग कर के 2 बाइट्स (यानी 16 बिट) आवंटित मैं कैसे उन दो बाइट्स में 65536 (बचाने में सक्षम का उपयोग करके कर रहा हूँ (पी) जो पूर्णांक प्रकार का सूचक है) .?? मुझे यह एहसास है कि इसका कारण शून्य * सूचक (पी = टी में) शून्य के स्वचालित प्रकार का कनवर्टन है, इसलिए यह है कि एम को पी को असाइन करने के लिए एमएलओसी के माध्यम से आवंटित किए गए मेमोरी क्षेत्रों तक पहुंच प्राप्त होती है। ??।
भले ही यह सब हो रहा है, वही स्मृति क्षेत्र (* पी) और (* डी) के माध्यम से दो अलग-अलग उत्तरों प्रिंट करता है (हालांकि यह भी समझाया जा सकता है कि क्या मैं प्रश्न 1 में कारण सोच रहा हूं)।
किसी यदि कुछ भी इस के पीछे के कारणों की व्याख्या कर सकते इस पर कुछ प्रकाश डाल सकते हैं, यह वास्तव में भी appreciated..and हो जाएगा ..
बहुत धन्यवाद
मॉलोक अनुरोध किए गए आकार को एक निश्चित गुणक की ओर ले जा रहा है। * निक्स के बारे में नहीं जानते, लेकिन विंडोज 8 बाइट्स के गुणकों तक इसे गोल करना पसंद करते हैं। यदि ऐसा है, तो आप अनुरोध किए गए क्षेत्र के बाहर लिख रहे हैं, लेकिन यह सुरक्षा मार्जिन के भीतर होता है, और इसलिए आप किसी और चीज को दूषित नहीं कर रहे हैं। – DCoder
आपने अपरिभाषित व्यवहार प्राप्त करने के लिए कास्टिंग पावर का ध्यानपूर्वक दुरुपयोग किया है। सी आपको * बुरी चीजें * करने के लिए महान शक्ति और लचीलापन देता है। आपको जिम्मेदारी लेनी है *** उन्हें नहीं *** ***। – dmckee
@dmckee मुझे पता है कि मैं जो कर रहा हूं वह नहीं किया जाना चाहिए, लेकिन इस पर ठोकर खाने के बाद मैं इसके पीछे के सटीक कारणों को जानने के लिए उत्सुक था, जिसे मैंने शुरू में अनुमान लगाया था कि 2 बाइट आवंटित शून्य * सूचक के int * में स्वचालित प्रकार रूपांतरण int * पॉइंटर को अधिक मेमोरी के बाद 2 बाइट्स तक पहुंच जाता है क्योंकि मेरी मशीन int पर 4 बाइट्स है। क्या यह सही है (मेरी धारणा) – abhi