我可以这样做吗?这有用吗?
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是元素数。
答案 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)
你可以做喜欢这样的事情,只要不像它那样太多。具体来说,您需要确保合理地处理所有内存的生命周期。
还有很多人指出你需要为你的结果分配空间,所以我不会涉及到那个部分。还有一些其他要点可以考虑。
现在,您已将a
和b
定义为char的指针,但您的函数会返回指向double的指针。这是无害的,但可能毫无意义和浪费。更糟糕的是,你然后通过“%d”转换将那些双打传递给printf
,所以它试图将整数视为整数而不是双打(你打印一个带有“%f”的双精度数) 。在这种情况下的结果是未定义的行为。
答案 6 :(得分:0)
如果您为结果分配了任何内存,它将起作用:
result = malloc(sizeof(*result) * n);
现在,释放内存成为调用者的责任。
调用者也可以传递double数组以填充结果,在这种情况下,您可以选择不使用动态分配的数组。