2010-04-30 12 views
16

के साथ एक सरणी का विस्तार करना मैं सामान्य रूप से मॉलोक और सी के लिए थोड़ा नया हूं। मैं जानना चाहता था कि यदि आवश्यक हो, तो मैं कैसे कर सकता हूं, अन्यथा निश्चित आकार के सरणी के आकार को मॉलोक के साथ बढ़ाएं।सी: मॉलोक

उदाहरण:

#define SIZE 1000 
struct mystruct 
{ 
    int a; 
    int b; 
    char c; 
}; 
mystruct myarray[ SIZE ]; 
int myarrayMaxSize = SIZE; 
.... 
if (i > myarrayMaxSize) 
{ 
    // malloc another SIZE (1000) elements 
    myarrayMaxSize += SIZE; 
} 
  • ऊपर के उदाहरण से स्पष्ट है कि मैं क्या करना चाहते बनाना चाहिए।

(वैसे: मैं इस एक दुभाषिया मैं लिखने के लिए की जरूरत है: चर की और मामले अधिक की जरूरत है में एक निश्चित राशि के साथ काम करें, बस उन्हें गतिशील रूप से आवंटित)

उत्तर

15

उपयोग realloc, लेकिन आप के लिए है पहले malloc के साथ सरणी आवंटित करें। आप इसे उपरोक्त उदाहरण में ढेर पर आवंटित कर रहे हैं।

size_t myarray_size = 1000; 
    mystruct* myarray = malloc(myarray_size * sizeof(mystruct)); 

    myarray_size += 1000; 
    mystruct* myrealloced_array = realloc(myarray, myarray_size * sizeof(mystruct)); 
    if (myrealloced_array) { 
    myarray = myrealloced_array; 
    } else { 
    // deal with realloc failing because memory could not be allocated. 
    } 
+5

'x = realloc (x, newsize) 'एक स्मृति रिसाव होने का इंतजार कर रहा है। –

+0

अच्छा बिंदु। मैंने realloc विफलताओं को संभालने के लिए उदाहरण कोड अद्यतन किया है। –

+0

'myarray = myrealloced_array)' होना चाहिए 'myarray = myrealloced_array; ':) – Saul

6

नहीं, आप नहीं कर सकते। एक बार परिभाषित होने के बाद आप स्टैक पर किसी सरणी के आकार को नहीं बदल सकते: यह निश्चित प्रकार का आकार है। या एक वैश्विक सरणी, या तो: यह आपके कोड नमूने से स्पष्ट नहीं है जहां myarray परिभाषित किया गया है।

आप malloc एक 1000-तत्व सरणी बना सकते हैं, और बाद में इसे realloc के साथ आकार बदल सकते हैं। यह आपको एक नई सरणी वापस कर सकता है, जिसमें पुराने से डेटा की प्रतिलिपि होती है, लेकिन अंत में अतिरिक्त स्थान के साथ।

1

ए) आपने इसे बनाने के लिए मॉलोक का उपयोग नहीं किया है ताकि आप मॉलोक के साथ विस्तार नहीं कर सकें। कार्य करें:

mystruct *myarray = (mystruct*)malloc(sizeof(mystruct) *SIZE); 

ख) का उपयोग realloc (RTM) बनाने के लिए यह बड़ा

+1

आरटीएम -> http://www.cplusplus.com/reference/cstdlib/realloc/ – Mawg

12

आप realloc उपयोग करने के लिए (के रूप में अन्य पोस्टर पहले ही बताया है चाहते हैं)। लेकिन दुर्भाग्य से, अन्य पोस्टर आप नहीं दिखाया उसे सही ढंग से उपयोग करने के लिए:

POINTER *tmp_ptr = realloc(orig_ptr, new_size); 
if (tmp_ptr == NULL) 
{ 
    // realloc failed, orig_ptr still valid so you can clean up 
} 
else 
{ 
    // Only overwrite orig_ptr once you know the call was successful 
    orig_ptr = tmp_ptr; 
} 

आप tmp_ptr उपयोग करने के लिए इतना है कि अगर realloc में विफल रहता है, तो आप मूल सूचक खोना नहीं है की जरूरत है।

संबंधित मुद्दे