使用指向现有数组的指针初始化数组

时间:2018-06-12 09:34:49

标签: c arrays pointers

我已经明白,不能在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}

我想询问是否可以为数组指定一个指向数组的指针。

一个等价的问题是:给定一个指向数组的指针,并且知道指针所指向的数组的大小,是否可以动态创建和初始化一个新数组,重要的旧副本?

3 个答案:

答案 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数组。并且指向数组的指针不遵循该定义。