gpt4 book ai didi

c - 使用指针返回 vector 的好方法

转载 作者:行者123 更新时间:2023-11-30 18:48:41 25 4
gpt4 key购买 nike

我读过有关 C 语言指针的理论,但我心里只有困惑。

想象一下,我调用一个方法,该方法必须使用指针(而不是 return 语句)返回一个 float 组。

第一点:我的方法的头部必须是这样的:myMet([somearguments], float* myvector)

第二点:是否建议在我的方法主体中创建另一个数组,填充它然后执行

*myvector = thatarray ?

我很抱歉问这样一个基本问题,但 C 中的指针似乎对我很敌意

最佳答案

我假设您不想以一种或另一种方式“硬编码”数组的大小。所以您可能已经有了这样的想法:

(请注意,下面是损坏的代码)

float *foo(void)
{
float x[] = { 0, 1.3, 27.4 };
return x;
}

这有多个问题,第一个是它根本不起作用:您返回一个指向局部变量的指针,并且局部变量具有自动存储持续时间,因此一旦离开范围,它就不再存在。从这个函数中,您得到一个不指向任何有效位置的指针。

<小时/>

如何正确地做到这一点,有多种可能性。惯用的 C 解决方案是您的调用代码提供实际的数组,这在您可以对所需大小有良好假设的所有情况下都是可行的:

size_t foo(float *arr, size_t size)
{
float x[] = { 0, 1.3, 27.4, -1.5, 23 };
size_t i;
for (i = 0; i < size && i < 5; ++i)
{
arr[i] = x[i];
}
return i;
}

int main(void)
{
float x[20];

// would return 5:
size_t elements = foo(x, 20);
}

如果这可行,则必须在函数中使用malloc()。您仍然可以返回尺寸,例如使用如下签名修改提供的指针:

size_t foo(float **arr)
{
size_t elements = 5;
*arr = malloc( elements * sizeof(**arr) );
// check *arr for NULL, if ok fill it
}

int main(void)
{
float *x;
size_t elements = foo(&x);
// process results
free(x);
}

或者,我个人更喜欢的是,您可以定义一个包含大小的 struct 并返回:

struct floats
{
size_t n;
float vals[];
}

struct floats *foo(void)
{
size_t elements = 5;
struct floats *x = malloc(sizeof(*x) + elements * sizeof(float));
// check for NULL, handle error ...

x->n = elements;
// fill elements in x->vals ...

return x;
}

请注意,虽然这是一个结构,但您不能只返回结构本身。由于灵活的数组成员,它的类型是不完整(因此在编译时,大小未知),因此只能返回指向它的指针。但是,如果您可以提前知道大小,那么无论如何您都应该选择我的第一个替代方案(让调用者提供数组)。

<小时/>

作为与您的问题无关的一般提示:使用float很少是一个好主意。几乎在所有情况下,您都希望使用 double 来代替。

关于c - 使用指针返回 vector 的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45082206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com