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);