将返回的指针分配给数组

时间:2010-07-29 15:48:45

标签: c arrays pointers

我有一个函数返回float *,它实际上在返回函数中填充为数组,以便

float* some_fnc()
{
    float *x=malloc(sizeof(float)*4);
    x[0]=......
}
...
// in main
float y[4];
y=some_fnc();

然而我收到“不兼容类型”错误,这是正常的吗?有没有办法克服这个w / o声明y为float *?

4 个答案:

答案 0 :(得分:5)

C不支持/允许分配数组(即使它确实支持数组的初始化,这看起来像赋值)。您有多种选择。一种是将数组的地址传递给函数,并让它填充现有的数组而不是为它分配空间:

void some_func(float *array, int size) { 
    for (i=0; i<size;i++)
       array[i] = ...
// ...
}

另一种可能性是在main中只有一个指针来保存函数返回的指针:

float *y = some_fnc();
// use y. Note that array style notation (y[0], y[1], etc.) is still allowed.

// when you're done with y.
free(y);

答案 1 :(得分:0)

您无法修改数组的地址。为什么不将y作为参数传递给some_fnc? (或者)如果你只知道运行时的大小,你可以使用浮点指针。不要在main中使用数组。

答案 2 :(得分:0)

在你的代码中,你基本上分配了两个不同的数组,一个在堆栈上,另一个在malloc。即使你可以在C中分配数组(你不能),每次调用你的函数时,用malloc分配的数组都会泄漏内存,所以你最终不应该这样做。

因此,如果您希望使用malloc在堆上分配数组,那么除了将其定义为float*之外别无其他方法。如果你这样做,不要忘记free你不再需要它了。

另一方面,如果您真的想要一个堆栈上的数组(注意可能的 stackoverflow ),您必须将此位置传递给您的函数,以便它可以将它用于您的初始化代码。 / p>

答案 3 :(得分:0)

正如其他人所提到的,您正在尝试分配指向数组的指针,但这不起作用。如果你真的想这样做,你可以改用结构。

struct foo { float f[4]; }

struct foo some_fnc()
{
    struct foo x;

    x.f[0] = 0.1;
    x.f[1] = 1.0;
    x.f[2] = 3.14159;
    x.f[3] = 42;

    return x;
}
...
// in main
struct foo y;
y = some_fnc();

另一种选择是将y的地址传递给some_fnc

void some_fnc( float x[4])
{
    x[0]=......
}
...
// in main
float y[4];
some_fnc(y);