2009-03-15 6 views
8

Ich mag im Grunde auf den C äquivalenten diesen (gut, nur den Teil mit dem Array, brauche ich nicht die Klasse und String-Parsing und das alles):Wie deklariert man die Größe eines Arrays zur Laufzeit in C?

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

Pardon meiner C Ignoranz. Ich habe von Java beschädigt;)

+0

Sieht so aus, als ob du schon von C++ korrumpiert wurdest;) – gbarry

Antwort

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; 
} 

Caveat: Aus der Manschette Sachen, ohne Fehlerprüfung.

+0

Du solltest das "if (foo) free (foo) ist die "Müllsammlung". – Joel

+0

Es gibt keine Müllsammlung in C. Ich würde lügen ;-) Aber ich habe ein paar Kommentare eingefügt. – dirkgently

+0

Ich glaube nicht, foo sollte statisch erklärt werden, die Bedeutung ist anders mit Java. Hier wollen wir nur eine globale Variable. – Ben

5

In C, können Sie mit diesem tun, dass, wenn Sie die Fehlerprüfung ignorieren:

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

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

Wenn Sie nicht über eine globale Variable wollen, und Sie C99 verwenden, könnten Sie tun:

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

Dies verwendet ein VLA - Array variabler Länge.

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

Wenn Sie die Daten initialisieren, dann können Sie calloc verwenden:

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

Auf diese Weise wird der zugewiesene Speicher mit Nullen initialisiert werden, was nützlich sein kann. Beachten Sie, dass Sie einen beliebigen Datentyp anstelle von int verwenden können.

1

Leider sind viele der Antworten auf diese Frage, darunter auch die akzeptiert sind richtig aber nicht entspricht dem Code des OP Schnipsel. Denken Sie daran, dass operator new[] den Standardkonstruktor für jedes Array-Element aufruft. Für POD-Typen wie int, die keinen Konstruktor haben, sind sie default-initialisiert (lies: null-initialisiert, siehe §8.5 ¶5-7 von The C++ Standard).

Ich tauschte nur malloc (nicht initialisierten Speicher zuzuteilen) für calloc (zuteilen genullt Speicher), so das Äquivalent zu dem Snippet C++ gegeben würde

#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; 
} 

Sorry für die Wiederbelebung dieser alten Frage, aber es hat einfach nicht fühle mich richtig, ohne einen Kommentar zu gehen (für den ich nicht die erforderliche Vertretung habe) ;-)

Verwandte Themen