C 是否分配不带逐元素副本的数组?

C 是否分配不带逐元素副本的数组?,c,arrays,pointers,C,Arrays,Pointers,我有一个创建数组的函数,比如说,大小5 函数是否可以接受一个指针(或者它可能需要指向指针的指针?),然后将所述指针指向数组,这样当被调用方查看指针时,它就可以看到数组的所有值 类似于这一点的东西(除非这不起作用): #定义长度5 无效赋值数组(int*指针) { int arr[LENGTH]={0,1,2,3,4}; //将指针指向数组,而不手动复制每个元素 指针=arr; } void main() { int*指针; 指针=malloc(sizeof(int)*长度); 赋值数组(指针);

我有一个创建数组的函数,比如说,大小
5

函数是否可以接受一个指针(或者它可能需要指向指针的指针?),然后将所述指针指向数组,这样当被调用方查看指针时,它就可以看到数组的所有值

类似于这一点的东西(除非这不起作用):

#定义长度5
无效赋值数组(int*指针)
{
int arr[LENGTH]={0,1,2,3,4};
//将指针指向数组,而不手动复制每个元素
指针=arr;
}
void main()
{
int*指针;
指针=malloc(sizeof(int)*长度);
赋值数组(指针);
int i;
对于(i=0;i
C分配数组,但不逐元素复制

C
中,无法分配数组(已分配编译时)。您需要将元素从一个数组复制到另一个数组

为了避免逐元素复制,可以使用库函数一次复制整个数组

我不太确定你想问什么,但似乎你需要做些什么来实现你的目标

如果您有要从中复制的辅助阵列
arr
,则可以写入

 memcpy( pointer, arr, ( (sizeof arr[0]) * LENGTH ));

intarr[LENGTH]={0,1,2,3,4}
将被堆栈分配,因此尝试返回指向其任何元素的指针将导致未定义的行为,因为当函数返回时,整个操作将超出范围


如果要更改指针指向的对象,请使用两级间接寻址
***
(即将指针传递给指针)。您需要使用
malloc
或类似的方法在堆上分配数组
arr

当您尝试这样做时,这是不可能的,因为您的本地
arr
被保存到堆栈中,并在函数
assignArry
完成后被清除。如前所述,您需要
memcpy

此答案将包含两部分:

正如其他答案中提到的,这就是你现在应该怎么做。类似代码中的常见构造为:

void assignArray(int *dest, size_t size)
{
       int i;

       // initialize with some data
       for (i=0; i<size; i++)
               dest[i] = i;
}
void赋值数组(int*dest,size\u t size)
{
int i;
//用一些数据初始化

对于(i=0;i执行您所描述的操作的代码可能如下所示:

#define LENGTH 5
void assignArray(int **pp)
{
   static int arr[LENGTH] = {0,1,2,3,4};

   // Point the pointer at the array, without manually copying each element
   *pp = arr;
}

int main()
{
    int *pointer;
    assignArray(&pointer);

    for (int i = 0 ; i < LENGTH ; i++) 
        printf("%d\n", pointer[i]);
}
#定义长度5
无效分配数组(整数**pp)
{
静态int-arr[LENGTH]={0,1,2,3,4};
//将指针指向数组,而不手动复制每个元素
*pp=arr;
}
int main()
{
int*指针;
赋值数组(&指针);
for(int i=0;i
请注意,不能简单地将
*pp
指向非静态局部变量
arr
。这是因为
int-arr[]=..
assignArray
返回时会超出范围


如果您希望每次调用
assignArray
都“返回”一个不同的数组,那么您当然必须分配空间并在每次要复制原始数组时使用
memcpy

pointer=arr
更改为
memcpy(pointer,arr,sizeof(arr))
。您可以将指针传递给指针,然后正如您所说的“将指针指向数组,而不手动复制每个元素”。但由于数组是本地的,一旦退出函数,指针将指向您不应尝试访问的内存(因为您不知道其中包含什么以及其他人可能正在使用它)。如果您使用指针传递指针(即指向指针的指针),然后您可以将其指向数组。但是,如果函数返回,数组将超出范围,这将不起作用,这会给您留下一个错误的指针,并且很可能是错误的。
memcpy
是OP完成任务所需的,但解释为何OP在这种情况下不应使用“指针指向指针”,这一点也很重要,正如@barak所解释的 manos@JonatanGoebel那要视情况而定。一个
静态
数组可以很好地处理这种情况。我们不要泛化这种情况。:-)对于特定的问题和示例,静态数组可以避免未定义的行为,但不会使其正确,这只是一个非常糟糕的设计选择。@JonatanGoebel这是个人选择,尽管我同意你的观点。请参阅。
#include <stdio.h>
#include <stdlib.h>

#define LENGTH 5
struct foo { int arr[LENGTH]; };

struct foo assignArray()
{
        struct foo bar = { .arr = {0,1,2,3,4} };

        /* return the array wrapper in struct on stack */
        return bar;
}

int main()
{
        struct foo *pointer;
        pointer = malloc(sizeof(*pointer));
        *pointer = assignArray(); /* this will copy the data, not adjust pointer location */

        int i;
        for (i = 0 ; i < LENGTH ; i++) printf("%d\n", pointer->arr[i]);

        return 0;
}
#define LENGTH 5
void assignArray(int **pp)
{
   static int arr[LENGTH] = {0,1,2,3,4};

   // Point the pointer at the array, without manually copying each element
   *pp = arr;
}

int main()
{
    int *pointer;
    assignArray(&pointer);

    for (int i = 0 ; i < LENGTH ; i++) 
        printf("%d\n", pointer[i]);
}