如何在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 } } 

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

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

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

在C中,如果忽略错误检查,则可以使用此方法:

 #include  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 – 可变长度数组。

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

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

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

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

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

 #include  /* 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; } 

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

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