2012-02-13 253 views
7

我有一個類似於此的循環,其中arrayfunction設置所有數組值,compute_with_both_arrays基於這兩個數組計算數字。陣列等於另一個陣列

他們的方式,我下面做不對array1 = array2工作。有沒有一種方法可以做到這一點,而不需要在每個循環中運行兩次arrayfuncion?

float sum = 0; 

float array1[10]; 
arrayfunction(0, array1); 

for(i=1; i<10; i++) { 
    float array2[10] 
    arrayfunction(1, array2); 

    float s; 
    s = compute_with_both_arrays(array1, array2); 
    sum = sum + s; 

    array1 = array2; 
} 
+6

'array1'不可分配。如果你的代碼片斷編譯,我建議你擺脫你的編譯器。 – pmg 2012-02-13 15:13:20

回答

9

必須手動存儲器從一個陣列使用函數複製到另一個像memcpy

因此,例如:

memcpy(array1, array2, sizeof(array1)); 

請記住,我們可以使用sizeof操作上array1,因爲它是在棧上分配一個明確的陣列。作爲一個評論者指出,我們通過目的地的大小來避免緩衝區溢出。請注意,對於靜態分配的陣列也可以使用相同的技術,但是不能使用在堆上動態分配的陣列上使用malloc,或者使用某些指向數組的指針......在這些情況下,您必須顯式傳遞數組大小作爲第三個參數。

最後,你需要使用memcpyfor -loop,因爲該功能用於在機器代碼級複製的內存使用的指令塊通常優化的將遠遠超出帶一個for循環的效率即使開啓了編譯器優化。

+0

值得注意的是,現代編譯器會自動將for循環副本轉換爲對memcpy(或展開後的副本序列,如果大小很小)的調用。這就是說,最好調用'memcpy'。 – 2012-02-13 15:28:40

+0

爲了安全起見,您應該始終傳遞目標數組的大小:「sizeof array1」而不是「sizeof array2」。 – ouah 2012-02-13 15:34:12

+0

@ouah:謝謝,我更新了該信息的發佈 – Jason 2012-02-13 17:28:50