2015-12-08 103 views
0

我在func1()中有一個靜態char數組。而當我調用func2()我傳遞它的char數組地址(雙指針),因爲我在它內部分配內存。然後,使用指針進行一些計算,並在第二次函數調用時指針不會被重置,但它指向我分配的字節範圍內的某處。雙指針指向同一個堆領域的隨機地址

比方說,我分配了500字節。第一次通話從0開始,第二次通話繼續。

讓我們現在另一種方法爲例,分配在FUNC1)內存(並且不需要使用相同的代碼,只要調用FUNC2雙指針()的指針被reseted和從0

開始我爲什麼經歷這個?

CASE 2

func2(char *array){ 

++array; // position 1 
} 

func1(){ 
    static char *array; 

    if(array == NULL){ 
    array = (char*) malloc(500 * sizeof(char)); 
    } 

    func2(array); 
    func2(array); // again position 1 


} 

CASE 1

func2(char **array){ 
    if(*array == NULL){ 
    *array = (char*) malloc(500 * sizeof(char)); 
    } 

    ++*array; // position 1 
} 

func1(){ 
    static char *array; 

    func2(&array); 
    func2(&array); // calling it again, pointer goes on position 2 
    // or it starts counting for ex. from position 55(random said) 

} 
+2

請粘貼代碼 – mkmk88

+1

請發佈一個[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),它可以證明問題。 –

+0

是的,我應該足夠了解這個概念。對不起,能夠產生很多 – Maxitj

回答

0

我通過像在情況2中它被認爲是coppied陣列和我改變一些 值,對其他致電值存在但指針 始終從頭開始?你能解釋一下我這個......

在呼籲func2(array)的情況下,不分配的數組對象的副本被傳遞,但只有一個指針值array的副本,當然,指向同樣的內存地址;因此,當func2()更改了數組對象元素的某些值時,這些更改的值自然會出現在具有相同對象地址的另一個調用中,而當func2()通過++array更改array的本地副本時,這不會影響func1()的本地指針名爲array

...但對於情況1,只有這樣才能表現同樣是永遠保存 起始位置,所以我可以遞減指針?

如果你想在func2(char **)要分配的數組對象,如情況1,但array指針沒有其他被func2()改變,你可以寫:

void func2(char **arrayaddress) 
{ 
    if (*arrayaddress == NULL) *arrayaddress = malloc(500); 
    char *array = *arrayaddress; // make own local copy, keep *arrayaddress unchanged 
    ++array; // position 1 
} 

void func1() 
{ 
    static char *array; 
    func2(&array); 
    func2(&array); // calling it again, pointer unchanged 
}