如何在c中返回一个数组

时间:2013-12-25 18:56:25

标签: c arrays

我知道之前已经问过这个问题,但是找不到我在这里描述的方式:

它的全部内容都是用c语言返回一维数组。在java中它非常简单:

 double[] myFunction() {

   double[] v = new double[10];

   return v;
 }

我知道c中的实现是不一样的。但由于数组元素可以被视为指向该数组中第一个元素的指针,我认为可以执行以下实现:

 double (*myFunction()) {

    double v[10];

    return v;
 }

这在gcc中编译得很好,但是当我调用该函数时,我得到了一个编译错误。

我的问题 - 如何以c语言返回一维向量?

由于

4 个答案:

答案 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;
}