我可以在函数中返回double *吗?

时间:2010-01-22 21:18:13

标签: c double return-value

我可以这样做吗?这有用吗?

double *vec_subtraction (char *a, char *b, int n)
{   
    double *result;
    int i;

    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];

    return result;
}

然后在main:

double *vec=vec_substraction(a, b, n);
for(i=1; i<n; i++)         
    printf("%d", vec[i]);

a和b是具有相同元素数的向量,n是元素数。

7 个答案:

答案 0 :(得分:11)

是的,你可以,但你需要在某处为result分配内存。

基本上,您可以在vec_subtraction内或vec_subtraction之外分配内存,如果您在外部分配,则可以静态或动态地执行此操作。

如果你打算在里面分配:

double *vec_subtraction (char *a, char *b, int n) {
    double *result = malloc(sizeof(double)*n);
    int i;
    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];

    return result;
}

并在主要:

double *vec;
// ...
vec = vec_subtraction(a, b, n);
// ...
free(vec); 

不要忘记free稍后调用vec_subtraction的结果。


如果您要在外面分配,则需要传入指向内存的指针:

void vec_subtraction (char *a, char *b, int n, double *result) {
    int i;
    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];
}

在main中:

// choose one of:
// double *vec = malloc(sizeof(double)*n);
// double vec[10]; // where 10= n.
vec_subtraction(a, b, n, vec);

// if you used *vec = malloc... remember to call free(vec).

答案 1 :(得分:3)

不是那样的。您需要在调用函数之前在堆栈上分配内存,或者在函数内的堆上分配内存。

double *vec_subtraction( ... ) {
     double *result = malloc(sizeof(double)*n);

     ...

     return result;
}

然后剩下的就行了。你需要记住释放内存。

另一个选项是:

void vec_subtraction( ..., double *result ) {


         ...

}

然后在主要:

 double result[n];
 vec_subtraction(..., result);

答案 2 :(得分:2)

你可以,但你似乎没有为结果向量分配任何内存。

答案 3 :(得分:2)

你当然可以从一个函数返回一个double *。只需确保指针仍指向有效对象。例如不要这样做:

double *vec_subtraction (char *a, char *b, int n) {
double result[n];
int i;

for(i=0; i<n; i++)
    result[i] = a[i]-b[i];

    return &result[0]; //error,the local array will be gone when the function returns.
}

虽然这样会很好:

double *vec_subtraction (char *a, char *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
if(result == NULL)
   return NULL;

for(i=0; i<n; i++)
    result[i] = a[i]-b[i];

    return result; //remember to free() the returned pointer when done.
}

答案 4 :(得分:1)

在你的vec_subtraction函数中,你在double * result中有一个未初始化的变量。如果你想让它返回一些有意义的东西,你需要为数组分配一些内存,例如

result = malloc(sizeof(double) * n);

然后你必须记得在完成后释放它:

free(vec);

但是,良好的做法(至少在我是C编码器时)是在相同的范围内分配内存和可用内存,当然可能。所以你应该把你的数组传递给你的vec_subtraction函数。您需要将函数的签名更改为:

vec_subtraction (char *a, char *b, int n, double *result)

这样称呼它:

double vec[n];
...
vec_subtraction (a, b, n, &result);

请原谅我的伪c,但希望你明白了。

祝你好运!

答案 5 :(得分:1)

你可以做喜欢这样的事情,只要不像它那样太多。具体来说,您需要确保合理地处理所有内存的生命周期。

还有很多人指出你需要为你的结果分配空间,所以我不会涉及到那个部分。还有一些其他要点可以考虑。

现在,您已将ab定义为char的指针,但您的函数会返回指向double的指针。这是无害的,但可能毫无意义和浪费。更糟糕的是,你然后通过“%d”转换将那些双打传递给printf,所以它试图将整数视为整数而不是双打(你打印一个带有“%f”的双精度数) 。在这种情况下的结果是未定义的行为。

答案 6 :(得分:0)

如果您为结果分配了任何内存,它将起作用:

result = malloc(sizeof(*result) * n);

现在,释放内存成为调用者的责任。

调用者也可以传递double数组以填充结果,在这种情况下,您可以选择不使用动态分配的数组。