2016-10-07 83 views
2

我只是有一個關於函數中數組的基本問題。 我想改變一個函數中的數組而不返回它。 我知道如何做到這一點整數或雙打,但我不知道如何做到這一點的陣列。所以我嘗試了一下,現在我很困惑。更改數組而不返回它[C]

我有我的代碼的2個變體,我認爲應該做同樣的事情,但他們不。我將數組b傳遞給函數Test。在功能我嘗試用值0,1,填補了陣列,2

#include <stdlib.h> 
#include <stdio.h> 

void Test(int * vector){ 
    vector = malloc(3*sizeof(int)); 
    int i; 
    for(i=0;i<3;i++){ 
     *(vector+i)=i; 
    } 

} 

int main(){ 
    int b[3]; 
    Test(b); 
    printf("%i\n",b[0]); 
    printf("%i\n",b[1]); 
    printf("%i\n",b[2]); 
    return EXIT_SUCCESS; 
} 

此版本不工作,我沒有得到預期的結果,另一方面0,1,2 這個代碼似乎工作:

#include <stdlib.h> 
#include <stdio.h> 

void Test(int * vector){ 
    int * b = malloc(3*sizeof(int)); 
    int i; 
    for(i=0;i<3;i++){ 
    *(b+i)=i; 
    *(vector+i) = *(b+i); 
    } 


} 

int main(){ 
    int b[3]; 
    Test(b); 
    printf("%i, ",b[0]); 
    printf("%i, ",b[1]); 
    printf("%i ",b[2]); 
    return EXIT_SUCCESS; 
} 

有人可以向我解釋爲什麼只有第二個工程?

最好的問候, 羅布

+0

'for(int i = 0; i <3; i ++)vector [i] = i;'是正確的代碼。你已經爲'main'中的堆棧中的數組分配了內存。所以你需要做的就是填寫數值。 – user3386109

+1

'vector = malloc(3 * sizeof(int));'用一個指向新的,不相關的內存塊的指針覆蓋'vector'參數。如果你想填充原始'vector'指向的內存,不要扔掉那個指針。 =) – Ryan

回答

1

當你將一個數組傳遞給一個函數時,它會衰變成一個指向第一個元素的指針。這就是功能所看到的。但是,您可以使用函數參數vector並用動態分配的內存覆蓋它。然後你不能訪問你傳入的數組。另外,你有內存泄漏,因爲你沒有釋放分配的內存。

在第二個功能的情況下,您不要修改vector,所以當您取消引用指針時,您將改變主要的b

此外,而不是這樣的:

*(vector+i) 

使用此:

vector[i] 

這更清楚的讀者意味着什麼。

+0

非常感謝! – Rob

+0

@Rob很高興我能幫到你。如果您覺得它有用,請隨時[接受此答案](http://stackoverflow.com/help/accepted-answer)。 – dbush

2

test並不需要調用malloc()。當你使用一個數組作爲函數參數時,它將一個指針傳遞給數組。所以你可以簡單地寫入vector[i],它會修改調用者的數組。

void Test(int * vector){ 
    int i; 
    for(i=0;i<3;i++){ 
     *(vector+i)=i; 
    } 
} 
+0

非常感謝。我做的比我想的要複雜得多。 – Rob