2009-03-15 17 views
8

Quiero básicamente a la C del equivalente de este (bueno, sólo la parte de la matriz, no necesito la clase y la cadena de análisis y todo eso):¿Cómo declarar el tamaño de una matriz en tiempo de ejecución en 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 
    } 
} 

Perdón mi ignorancia C. He sido corrompidos por java;)

+0

Parece que también ha sido corrompido por C++;) – gbarry

Respuesta

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

Advertencia: Apagado el material del manguito, sin ningún tipo de comprobación de errores.

+0

Debería mencionar que "if (foo) free (foo); es la "recolección de basura". – Joel

+0

No hay recolección de basura en C. Estaría mintiendo ;-) Pero hice algunos comentarios. – dirkgently

+0

No creo que foo deba declararse estático, el significado es diferente con java. Aquí solo queremos una variable global. – Ben

5

En C, se puede hacer eso con esto, si se ignora la comprobación de errores:

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

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

Si no desea que una variable global y está utilizando C99, que podría hacer:

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

Esto utiliza una matriz de longitud variable VLA.

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

Si necesita inicializar los datos, puede utilizar calloc:

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

De esta manera, la memoria asignada se inicializa con ceros, que pueden ser útiles. Tenga en cuenta que puede usar cualquier tipo de datos en lugar de int.

1

Por desgracia, muchas de las respuestas a esta pregunta, incluido el aceptado una, son correcta pero no equivalente al código del fragmento OP. Recuerde que operator new[] llama al constructor predeterminado para cada elemento de la matriz. Para los tipos de POD como int que no tienen un constructor, se inicializan por defecto (léase: inicializado en cero, consulte §8.5 ¶5-7 de The C++ Standard).

acabo intercambiaron malloc (asignar memoria sin inicializar) para calloc (asignar memoria en cero), por lo que el equivalente al fragmento dado C++ sería

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

Lo siento por la reactivación de esta vieja pregunta, pero simplemente no lo hicieron se siente bien al irme sin un comentario (que no tengo el representante requerido) ;-)

Cuestiones relacionadas