我有一个创建数组的函数,比如大小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]);
}
答案 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
。这是因为arr
在int 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;
}