2010-01-22 111 views
5

我可以這樣做嗎?這會工作嗎?函數中可以返回double *嗎?

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=vec_substraction(a, b, n); 
for(i=1; i<n; i++)   
    printf("%d", vec[i]); 

a和b是與相同數目的元素的向量,n是元素的個數。

+0

我也可以在main中做到這一點嗎?分配數組: 'double * resoult = vec_subtraction(a,b,n);' – Devel 2010-01-22 22:01:09

+0

對於記錄來說,像這樣做矢量數學的通常方法是將指針傳遞到結果存儲的任何地方(即' void vec_subtraction(char * a,char * b,double * c,int n);')。這允許調用者重用緩衝區,並且有時對結果和一個輸入使用相同的緩衝區。我們有一個奇怪的失敗項目,因爲'malloc()'在執行時間上太不確定了。 – 2010-01-22 22:46:53

回答

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

// 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). 
+0

在C99及更高版本中,還有'double vec [n];'。 – 2010-01-23 03:41:36

2

可以,但你不t好像爲結果向量分配任何內存。

0

如果您分配的任何內存的結果它的工作:

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

現在它變成了主叫方的釋放內存的責任。

調用者也可能會傳遞double數組來充滿結果,在這種情況下,您可能會選擇不使用動態分配的數組。

3

不是這樣的。您需要在調用函數之前在堆棧中分配內存,或者在函數中調用堆中的內存。

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

    ... 

    return result; 
} 

然後其餘的工作。你需要記住釋放內存。

另一種選擇是:

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


     ... 

} 

然後在主:

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

你當然可以從一個函數返回一個雙*。只要確保指針仍然指向一個有效的對象。例如不這樣做:

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. 
} 
1

在你vec_subtraction功能,您必須在雙*結果的未初始化變量。如果你想讓它返回一些有意義的東西,你需要爲該數組分配一些內存,例如

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,但希望你的想法。

祝你好運!

1

你可以做些什麼這個,只要它不是太多喜歡它。具體而言,您需要確保您合理地處理所有內存的生命週期。

不少其他人已經指出,你需要爲你的結果分配空間,所以我不會進入那部分。但還有其他幾點需要考慮。

現在,您已將ab定義爲指向char的指針,但是您的函數將返回指向double的指針。這是無害的,但可能毫無意義和浪費。更糟糕的是,你將這些雙打通過「%d」轉換傳遞給printf,所以它試圖把整數看作是整數而不是雙打(你會用「%f」打印雙精度)。在這種情況下的結果是未定義的行爲。

相關問題