不按元素复制分配数组?

时间:2015-05-11 10:29:07

标签: c arrays pointers

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

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

有些事情(除了这不起作用):

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

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

 void main()
 {
       int *pointer;
       pointer = malloc(sizeof(int) * LENGTH);
       assignArray(pointer);

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

5 个答案:

答案 0 :(得分:2)

  

C分配没有元素复制的数组

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

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

我不太确定你想在这里问什么,但似乎你需要memcpy()来实现你的目标。

如果你有一个辅助数组arr复制,你可以写

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

答案 1 :(得分:1)

执行您所描述的内容的代码可能如下所示:

.click(

请注意,不只是将#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]); } 指向非静态局部变量*pp。这是因为arrint arr[] = ....返回时会超出范围。

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

答案 2 :(得分:0)

int arr[LENGTH] = {0,1,2,3,4};堆栈分配,因此尝试返回指向其任何元素的指针将为您提供未定义的行为,因为当函数返回时,整个事物将超出范围。

如果要更改指针指向的内容,请使用2级间接**(即将指针传递给指针)。您需要使用arr或类似内容在上分配数组malloc

答案 3 :(得分:0)

当您尝试这样做时,由于您的本地arr已保存到堆栈并在函数assignArry完成后被清理,因此无法实现。如前所述,您需要memcpy

答案 4 :(得分:0)

这个答案将分为两部分:

正如其他答案中所提到的,现在你应该如何做到这一点。类似代码中的常见构造是:

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

       // initialize with some data
       for (i=0; i<size; i++)
               dest[i] = i;
}

这样你就不会浪费中间缓冲区的空间和时间。

这个答案的第二部分是关于在结构中包装数组。这是一个愚蠢的伎俩,在某种程度上实现了你所要求的,以及你可能因为额外的数据复制而不想要的东西。

示例代码:

#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;
}