2009-03-15 5 views
8

मैं मूल रूप से इसके समकक्ष सी को चाहता हूं (ठीक है, केवल सरणी के साथ भाग, मुझे कक्षा और स्ट्रिंग पार्सिंग की आवश्यकता नहीं है और यह सब कुछ):सी में रनटाइम पर सरणी के आकार की घोषणा कैसे करें?

public class Example 
{ 
    static int[] foo; 
    public static void main(String[] args) 
    { 
     int size = Integer.parseInt(args[0]); 
     foo = new int[size]; // This part 
    } 
} 

मेरी सी अज्ञान क्षमा करें। मैं जावा द्वारा दूषित हो गया है;)

+0

ऐसा लगता है कि आप सी ++ द्वारा भी दूषित हो गए हैं;) – gbarry

उत्तर

11
/* We include the following to get the prototypes for: 
* malloc -- allocates memory on the freestore 
* free -- releases memory allocated via above 
* atoi -- convert a C-style string to an integer 
* strtoul -- is strongly suggested though as a replacement 
*/ 
#include <stdlib.h> 
static int *foo; 
int main(int argc, char *argv[]) { 
    size_t size = atoi(argv[ 1 ]); /*argv[ 0 ] is the executable's name */ 
    foo = malloc(size * sizeof *foo); /* create an array of size `size` */ 
    if (foo) { /* allocation succeeded */ 
     /* do something with foo */ 
     free(foo); /* release the memory */ 
    } 
    return 0; 
} 

चेतावनी: कफ सामान बाहर, बिना किसी भी त्रुटि जाँच।

+0

आपको यह उल्लेख करना चाहिए कि "if (foo) free (foo); " "कचरा संग्रह" है। – Joel

+0

सी में कोई कचरा संग्रह नहीं है। मैं झूठ बोलूंगा ;-) लेकिन मैंने कुछ टिप्पणियों में लिखा था। – dirkgently

+0

मुझे नहीं लगता कि foo स्थिर घोषित किया जाना चाहिए, अर्थ जावा के साथ अलग है। यहां हम सिर्फ एक वैश्विक चर चाहते हैं। – Ben

5

सी में, आप ऐसा कर सकते हैं इस के साथ, यदि आप त्रुटि जाँच की अनदेखी:

#include <stdlib.h> 
static int *foo; 

int main(int argc, char **argv) 
{ 
    int size = atoi(argv[1]); 
    foo = malloc(size * sizeof(*foo)); 
    ... 
} 

आप एक वैश्विक चर और आप C99 उपयोग कर रहे हैं नहीं करना चाहती हैं, तो आप कर सकता है:

int main(int argc, char **argv) 
{ 
    int size = atoi(argv[1]); 
    int foo[size]; 
    ... 
} 

यह एक वीएलए-चर लंबाई लंबाई का उपयोग करता है।

int* arr = calloc (nb_elems, sizeof(int)); 
/* Do something with your array, then don't forget to release the memory */ 
free (arr); 

इस तरह, आबंटित स्मृति शून्य है, जो उपयोगी हो सकता है के साथ प्रारंभ किया जाएगा:

0
int count = getHowManyINeed(); 
int *foo = malloc(count * sizeof(int)); 
2

आप डेटा प्रारंभ करने की आवश्यकता है, तो आप calloc उपयोग कर सकते हैं। ध्यान दें कि आप int के बजाय किसी भी डेटा प्रकार का उपयोग कर सकते हैं।

1

दुर्भाग्य से, स्वीकार किए जाते हैं एक सहित इस सवाल का, के जवाब के कई, सही लेकिन ओ पी के कोड के बराबर नहीं स्निपेट हैं। याद रखें कि operator new[] प्रत्येक सरणी तत्व के लिए डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करता है। int जैसे पीओडी प्रकारों के लिए जिनके पास कोई कन्स्ट्रक्टर नहीं है, वे डिफ़ॉल्ट-प्रारंभिक हैं (पढ़ें: शून्य-प्रारंभिक, The C++ Standard के §8.5 ¶5-7 देखें)।

मैं सिर्फ विमर्श malloccalloc (ध्यान केंद्रित किया स्मृति को आबंटित) के लिए (अप्रारंभीकृत स्मृति को आबंटित), इसलिए दिए गए सी ++ टुकड़ा के बराबर

#include <stdlib.h> /* atoi, calloc, free */ 

int main(int argc, char *argv[]) { 
    size_t size = atoi(argv[1]); 
    int *foo; 

    /* allocate zeroed(!) memory for our array */ 
    foo = calloc(sizeof(*foo), size); 
    if (foo) { 
     /* do something with foo */ 

     free(foo); /* release the memory */ 
    } 

    return 0; 
} 

क्षमा किया जाएगा इस पुराने सवाल को पुनर्जीवित करने के लिए, लेकिन यह सिर्फ ऐसा नहीं किया बिना किसी टिप्पणी के छोड़ने का अधिकार महसूस करें (जिसमें मेरे पास आवश्यक प्रतिनिधि नहीं है) ;-)

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