मैं सी के लिए थोड़ा नया हूं और मुझे यह समझने में परेशानी हो रही है कि स्मृति कैसे काम करती है, विशेष रूप से memcpy
जैसे अंतर्निर्मित कार्यों में।सी - मॉलोक और मेम्पी (मेमोरी मैनेजमेंट)
यहाँ एक struct
मैं
struct data_t {
int datasize;
void *data;
};
उपयोग कर रहा हूँ है और यहाँ एक सहायक समारोह है कि मैं इसे उपयोग कर रहा हूँ के साथ है:
struct data_t *data_create(int size)
{
struct data_t *dt=malloc(sizeof(struct data_t)+size);
dt->datasize=size;
dt->data="1234567890a";
return dt;
}
अब main
समारोह में मैं यह कर रहा कोई समस्या नहीं है:
struct data_t *data = data_create(1024);
data->data="123456a";//just an example
लेकिन यह एक सेग फाल्ट फेंकता है:
memcpy(data->data,"123456a",strlen("1234567890a")+1);
मेरा प्रश्न है क्यों? और मैं इससे कैसे बचूं? कृपया ध्यान रखें कि मैं सी के लिए नया हूं, तो सी मेमोरी के साथ कैसे सौदों मेरे लिए थोड़ा नया है
धन्यवाद।
संपादित करें: यह काम करता है! आपका बहुत बहुत धन्यवाद। डेटा पॉइंटर को पूरी तरह याद किया। अब सब कुछ valgrind के अनुसार ठीक काम कर रहा है।
अंतरिक्ष आरंभिक आवंटन में आवंटित किया गया था; पॉइंटर बस आवंटित स्थान को इंगित करने के लिए सेट नहीं किया गया था। –
@ जोनाथन लेफ्लर: हां, शुरुआत में आवंटित होने पर पूछने वाले ने कुछ अतिरिक्त जगह आवंटित की, उसे बिंदु पर प्रारंभ करना चाहिए था। यदि आप सभी को एक साथ आवंटित करने की कोई विशिष्ट आवश्यकता नहीं है, तो भी मैं स्पष्ट कॉल पसंद करूंगा। – phoxis
यह एक त्रुटि देगा: "शून्य * * से 'data_t *' [-fpermissive]" से अमान्य रूपांतरण हल करने के लिए "आपको मॉलोक द्वारा लौटाए गए सूचक को स्पष्ट रूप से डालना होगा"। – VasaraBharat