今天早上我和一位同事讨论了这个话题。他说,将数组分配为指针数组总是更好的选择,因为逐个分配每个元素有更好的机会获得一个空闲的内存块。就像这样:
// Consider n_elements as a dynamic value
int n_elements = 10, i;
int **ary = (int **) malloc(sizeof(int *) * n_elements);
for(i = 0; i < n_elements; i++)
{
ary[i] = (int *) malloc(sizeof(int));
}
与他的方法相反,我认为更好的方式是分配元素数组,因为这样你可以得到一块紧凑的内存块,而不是散布在堆中的大量引用。就像这样:
int n_elements = 10;
int *ary = (int *) malloc(sizeof(int) * n_elements);
ary[0] = 100;
经过这次对话,我一直在思考,并得出结论:这取决于具体情况。针对小数据类型,我认为第二种解决方案是更好的选择,原因如上所述;但是当分配大型结构体数组时,第一种方法可能更好。
除了我的结论,你对此有何看法?
int a[10];
是最好的选择,做另外两种方法都有点儿疯狂。对于一个由N个项目组成的单一连续序列,后者(减去malloc()
的强制类型转换)是最佳选择(很少不是这种情况)。前者只有在需要任意长度的任意长度列表的列表时才通常使用,在实际使用2D数组语法时提供语法(而实际上它却不是)。但是,这取决于您非常具体的需求。 - WhozCraig