我已经明白,不能在c中为数组分配数组。声明如下:
int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array2[10];
int * array3 = array;
有效,但是连续声明:
array2 = array1;
不是,因为数组会衰减到指针。我发现这不令人满意,因为如果我有一个创建数组的函数:
int * arrcreate() {
static int funcarray[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
return funcarray
}
我在我的主程序中调用它,我想处理数组,而不是指针。 当然,我可以在我的主程序中创建一个数组并手动填充:
int main() {
int array[10];
int i;
int * p = arrcreate();
for(i = 0; i<10, i++) {
array[i] = p[i];
}
}
但是因为我知道在初始化数组时可以做一些任务:
int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
我想询问是否可以为数组指定一个指向数组的指针。
一个等价的问题是:给定一个指向数组的指针,并且知道指针所指向的数组的大小,是否可以动态创建和初始化一个新数组,重要的旧副本?
答案 0 :(得分:2)
正如芭丝谢芭所说,阵列不能放在作业的左侧,就像你提出的问题一样。但是如果你总是知道要复制的数组的指针,以及数组大小,你可以编写一个函数:
void copy_array(const int *a, const int arraySize, int **b) {
*b = malloc(arraySize * sizeof(*a));
for (int indx = 0; indx < arraySize; indx++) {
(*b)[indx] = a[indx];
}
}
int main() {
int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int *array2;
copy_array(array1, &array2);
// do stuff
free(array2);
}
这是一个选择吗?
答案 1 :(得分:1)
非正式地说,数组不能是左值。这意味着数组不能位于赋值的左侧。
其次注意int array1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
;是不分配,但数组初始化。
如果你对术语粗心大意,这两句似乎是矛盾的。但他们不是;此外,您可以看到不可以使用特定指针指向的值初始化数组。您需要在memcpy
。
答案 2 :(得分:1)
不幸的是答案不是。 C11的n1570草案在6.7.9初始化中表示:
...
11否则,具有聚合或联合类型的对象的初始值设定项应为括号括起来的括号 元素或命名成员的初始值设定项列表。
(前面的项目涉及struct,union或character type array)
这意味着只能使用括号括起的整数值列表初始化int数组。并且指向数组的指针不遵循该定义。