2012-11-18 57 views
1

我知道的数组c的malloc()VS {}

int *x = malloc(sizeof(int)*100); 

int x[100]; 

结果是相同的,但第一个被分配的堆存储器中,并且第二个是分配堆栈记忆。

现在我需要创建一个巨大的数组(约10000个元素,而不是一个模式),我认为malloc()更合适。

但是,当我准备初始化数组时,我面临一个问题。 我不能使用任何循环来初始化数组,我怎么能初始化,通过使用malloc,就像使用

int x[100] = {1,2,3,4,......,6,7,5}; 
+4

你不能循环初始化你的动态数组,因为....? – WhozCraig

+0

*我不能使用任何循环来初始化数组* - 为什么不呢? – cdarke

+2

StackOverflow经验法则#3有效:“如果OP说'我知道',他们不会。” –

回答

2

当你说int a[] = { 1, 2, 3 };创建一个数组,你使用的是初始化提供初始数据为(并推断其大小)数组a。这是C.

的语法的一部分。当你说int * p = malloc(1000);,你只是做一个库调用和存储指针。语言或库中没有机制为该指针指向的内存提供初始值,也不需要该指针指向任何内容(它可能是NULL)。你应该注意到数组不是指针,指针也不是数组。 ap是完全不同的动物,尽管事实上你可以说p[1] = a[1];

+0

有没有不能像b一样对待的情况?除了free()和realloc()之类的函数之外,或者将指针传递给a可能是不安全的。 – Paul

+0

@Paul:当然:'int n; p =&n;'是有效的,但是'a =&n;'不是。数组衰减产生“rvalues”(如果这是有道理的话)。此外,'&p'的类型为'int **',而'&a'的类型为'(int *)[3]'。 –

+0

这很有道理。 – Paul

0

如果您无法使用循环初始化数组,可以使用memset()并避开它。

0

如果数据不改变,最好的办法是写

static const int x [100] = { 23, 12, 5, 7, ... }; 

无代码。没有时间需要初始化。我已经看到了以这种方式初始化兆字节数据的代码,没有任何问题。