2009-03-15 22 views
8

Chcę zasadniczo do C odpowiednik tego (dobrze, tylko część z tablicy, nie muszę klasę i ciąg analizowania i to wszystko):Jak zadeklarować rozmiar tablicy w środowisku wykonawczym w 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 mój C ignorancję. I już zostały uszkodzone przez Java;)

+0

Wygląda na to, że zostałeś uszkodzony także przez C++;) – gbarry

Odpowiedz

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

zastrzeżenie: Off rzeczy mankietu, bez sprawdzania błędów.

+0

Powinieneś wspomnieć, że "if (foo) free (foo)); " jest "zbiorem śmieci". – Joel

+0

Nie ma zbierania śmieci w C. Leżałabym ;-) Ale dodałem kilka komentarzy. – dirkgently

+0

Nie sądzę, że foo powinno być zadeklarowane jako statyczne, znaczenie jest inne w przypadku języka Java. Tutaj potrzebujemy tylko zmiennej globalnej. – Ben

5

W C, można to zrobić z tym, jeśli pominąć sprawdzanie błędów:

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

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

Jeśli nie chcesz zmienną globalną i używasz C99, można zrobić:

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

Wykorzystuje to tablicę o zmiennej długości VLA.

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

Jeśli trzeba zainicjować danych, można użyć calloc:

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

ten sposób przydzielona pamięć zostanie zainicjowany zerami, które mogą być użyteczne. Zauważ, że możesz użyć dowolnego typu danych zamiast int.

1

Niestety, wiele odpowiedzi na to pytanie, w tym przyjętego jednego, są poprawne ale nie odpowiednikiem kodu PO za snippet. Pamiętaj, że operator new[] wywołuje domyślny konstruktor dla każdego elementu tablicy. W przypadku typów POD, takich jak int, które nie mają konstruktora, są one inicjowane domyślnie (read: zero-initialized, zobacz §8.5 ¶5-7 z The C++ Standard).

Właśnie wymieniane malloc (przydzielić pamięci niezainicjowanej) dla calloc (przeznaczyć wyzerowany pamięci), więc odpowiednik danego C++ fragmencie byłoby

#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 za zabicie ten stary pytanie, ale to po prostu nie czuję się prawo do wyjazdu bez komentarza (którego nie mam wymaganego przedstawiciela) ;-)

Powiązane problemy