我基本上想要相当于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损坏了;)
答案 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));