How to declare the size of an array at runtime in C?

前端 未结 5 1075
我在风中等你
我在风中等你 2021-01-17 17:19

I basically want to the C of equivalent of this (well, just the part with the array, I don\'t need the class and string parsing and all that):

public class E         


        
相关标签:
5条回答
  • 2021-01-17 17:31

    If you need to initialize the data, you can use calloc:

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

    This way, the allocated memory will be initialized with zeroes, which can be useful. Note that you can use any data type instead of int.

    0 讨论(0)
  • 2021-01-17 17:37
    /* 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:Off the cuff stuff, without any error checking.

    0 讨论(0)
  • 2021-01-17 17:38

    In C, you can do that with this, if you ignore the error checking:

    #include <stdlib.h>
    static int *foo;
    
    int main(int argc, char **argv)
    {
         int size = atoi(argv[1]);
         foo = malloc(size * sizeof(*foo));
         ...
    }
    

    If you don't want a global variable and you are using C99, you could do:

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

    This uses a VLA - variable length array.

    0 讨论(0)
  • 2021-01-17 17:39

    Unfortunately, many of the answers to this question, including the accepted one, are correct but not equivalent to the OP's code snippet. Remember that operator new[] calls the default constructor for every array element. For POD types like int that do not have a constructor, they are default-initialized (read: zero-initialized, see §8.5 ¶5-7 of The C++ Standard).

    I just exchanged malloc (allocate uninitialized memory) for calloc (allocate zeroed memory), so the equivalent to the given C++ snippet would be

    #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 for reviving this old question but it just didn't feel right to leave without a comment (which I do not have the required rep for) ;-)

    0 讨论(0)
  • 2021-01-17 17:43
    int count = getHowManyINeed();
    int *foo = malloc(count * sizeof(int));
    
    0 讨论(0)
提交回复
热议问题