如何在C中声明运行时数组的大小?

时间:2009-03-15 20:56:39

标签: c arrays

我基本上想要相当于C的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
    }
}

请原谅我的无知。我被java损坏了;)

5 个答案:

答案 0 :(得分: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;
}

警告:关闭袖口,没有任何错误检查。

答案 1 :(得分:5)

在C中,如果忽略错误检查,则可以这样做:

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

这使用VLA - 可变长度数组。

答案 2 :(得分:2)

如果需要初始化数据,可以使用calloc:

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

这样,分配的内存将用零初始化,这可能很有用。请注意,您可以使用任何数据类型而不是int。

答案 3 :(得分:1)

不幸的是,这个问题的许多答案,包括已接受的答案,正确,但等同于OP的代码段。请记住operator new[]为每个数组元素调用默认构造函数。对于没有构造函数的POD类型(如int),它们是默认初始化的(读取:零初始化,参见The C++ Standard的§8.5¶5-7)。

我刚刚为malloc交换了calloc(分配未初始化的内存)(分配归零的内存),所以相当于给定的C ++代码段

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

很抱歉恢复这个老问题,但是如果没有评论(我没有所需的代表),我感觉不对; - )

答案 4 :(得分:0)

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