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

C 我可以在函数中返回双*吗?,c,double,return-value,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; } double*vec\u减法(char*a,char*b,int n) { 双*结果; int i; 对于(i=0;i是的,您可以,但

我可以这样做吗?这样行吗

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;
}
double*vec\u减法(char*a,char*b,int n)
{   
双*结果;
int i;

对于(i=0;i是的,您可以,但是您需要为
result
的某个地方分配内存

基本上,您可以在
vec_减法
内部分配内存,也可以在
vec_减法
外部分配内存,如果您在外部分配内存,则可以静态或动态分配内存

如果要在内部分配:

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;
}
不要忘记在以后的某个时候释放调用
vec_减法的结果


如果要在外部进行分配,则需要传入指向内存的指针:

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];
}

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

如果您为结果分配了任何内存,则可以:

result = malloc(sizeof(*result) * n);
现在,释放内存成为调用者的责任


调用方还可能传递要用结果填充的双数组,在这种情况下,您可能会选择不使用动态分配的数组。

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

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

     ...

     return result;
}
然后剩下的就行了。不过你需要记住释放内存

另一个选择是:

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


         ...

}
然后大体上:

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

您当然可以从函数返回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\u减法(char*a,char*b,int n){
双结果[n];
int i;

对于(i=0;i,在向量减法函数中,在double*结果中有一个未初始化的变量

result = malloc(sizeof(double) * n);
然后,您必须记住在完成后释放它:

free(vec);
然而,好的做法(至少在我还是一名C-coder的时候)是在同一范围内分配内存和释放内存,当然,如果可能的话。因此,您确实应该将数组传递给您的vec_减法函数。您需要将函数的签名更改为:

vec_subtraction (char *a, char *b, int n, double *result)
这样称呼:

double vec[n];
...
vec_subtraction (a, b, n, &result);
请原谅我的假c,但希望你能理解

祝你好运!

你可以这样做,只要不太像。具体来说,你需要确保你合理地处理了所有内存的生命周期

还有很多人指出,你需要为你的结果分配空间,所以我不想进入这一部分。不过,还有其他几点需要考虑


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

我也可以在main中执行此操作吗?分配数组:
double*resourct=vec\u减法(a,b,n)
对于记录,像这样做向量数学的通常方法是将指针传递到结果存储的位置(即,
无效向量减法(char*a,char*b,double*c,int n);
)。这允许调用方重用缓冲区,有时对结果和一个输入都使用相同的缓冲区。我们有一个项目出现了奇怪的失败,因为
malloc()
在执行时间上太不确定。在C99及更高版本中也有
double-vec[n];
free(vec);
vec_subtraction (char *a, char *b, int n, double *result)
double vec[n];
...
vec_subtraction (a, b, n, &result);