我有一个函数返回float *,它实际上在返回函数中填充为数组,以便
float* some_fnc()
{
float *x=malloc(sizeof(float)*4);
x[0]=......
}
...
// in main
float y[4];
y=some_fnc();
然而我收到“不兼容类型”错误,这是正常的吗?有没有办法克服这个w / o声明y为float *?
答案 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);