我知道之前已经问过这个问题,但是找不到我在这里描述的方式:
它的全部内容都是用c语言返回一维数组。在java中它非常简单:
double[] myFunction() {
double[] v = new double[10];
return v;
}
我知道c中的实现是不一样的。但由于数组元素可以被视为指向该数组中第一个元素的指针,我认为可以执行以下实现:
double (*myFunction()) {
double v[10];
return v;
}
这在gcc中编译得很好,但是当我调用该函数时,我得到了一个编译错误。
我的问题 - 如何以c语言返回一维向量?
由于
答案 0 :(得分:3)
示例代码
#include <stdio.h>
#include <stdlib.h>
double *myFunction1(){
return malloc(10*sizeof(double));
}
double (*myFunction2())[10]{
double (*p)[10];
p = malloc(sizeof(double[10]));
return p;
}
typedef struct d10 {
double vec[10];
} D10;
D10 myFunction3(){//Make little sense
D10 v = {{0}};
v.vec[9]=1.25;
return v;
}
int main(){
double *v1 = myFunction1();
double (*v2)[10] = myFunction2();
D10 v3= myFunction3();
//do something
printf("%lf\n", v3.vec[9]);
v1[0] = 3.14;
(*v2)[0] = 3.14 * 2;
free(v1);
free(v2);
return 0;
}
答案 1 :(得分:2)
已更正:
你不能传递一个数组,你不能返回一个只传递一个地址的数组,或者返回一个指向它的第一个元素:
double *someFunction()
{
double *output;
p = (double *)malloc(size*sizeof(double)); // size should be defined
//... do some process with the content pointed to by output
return output; // return the address pointed to by output
}
或者将指针传递给它第一个元素,并对指向的内容执行一些处理。
void someFunction(double *output, int size)
{
//... do some process with the content pointed to by output
}
答案 2 :(得分:1)
首先,在函数中声明v
使数组仅在该函数中存活。函数返回后,该数组将从堆栈中弹出,并且可能在连续函数调用后被修改。
正确的C解决方案是使用malloc
来分配可用作数组的空间量,并将指针返回到该数组。
double * myFunc(){
double * v = malloc(10*size of(double));
return v;
}
在Java中,返回一个数组是安全的,因为垃圾收集器可以在弹出堆栈后检测到该数组仍在使用中。
答案 3 :(得分:0)
如何用c语言返回一维向量?
从技术上讲,一个人没有。 C函数不能返回数组类型。
您遇到的主要问题是,在C代码中,v
仅在函数的生命周期内存在;函数退出后,v
不再存在,因此您返回的任何指针都无效。
要实现这一点,您必须执行与Java代码相似的操作;你需要从堆中为数组分配内存(即动态分配):
double *myfunction()
{
double *v = malloc( sizeof *v * 10 );
return v;
}
请注意,C不会在您之后进行清理,因此您在完成后必须明确free
该内存,例如:
int main( void )
{
double *arr = myfunction();
/**
* do stuff with arr
*/
free( arr );
return 0;
}