2011-03-07 103 views
1

動態數組的大小是靜態數組大小的兩倍。我想將從動態數組的(N/2)-1到N-1開始的值賦給整個靜態數組。如何將動態數組的一部分分配給整個靜態數組

唯一的方法是複製一個循環的值?

我的代碼:

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

int main(int argc, char *argv[]) 
{ 
    int N=100, pSize=4, lSize, i; 
    double *A; 

    lSize=N/sqrt(pSize); 
    /* memory allocation */ 
    A=(double*)malloc(sizeof(double)*N); 

    double B[lSize]; 
    /* memory allocation has been done */ 

    /* initilize arrays */ 
    for(i=0; i<lSize; i++){ 
     B[i]=rand()% 10; 
    } 

    A=B; 
    for (i=0; i<lSize; i++){ 
     fprintf(stdout,"%f\n", A[i]); 
    } 


    return 0; 
} 

回答

2

可以使用memcpy的功能來複制數據。爲了您的比如你要A的後半段複製到B那麼可以這樣做:

memcpy(&B[0], &A[lSize-1], lSize * sizeof(double)); 

注:在我所用,這是需要MinGW的編譯器,我宣佈了目的地& B [0 ],我認爲我可以只用B.這可能是由於我有配置(我不使用C編譯器,通常只是使用g ++快速C++測試用例)。

+1

你最好複製更多,如果你想整個陣列是充滿不是'lSize'字節。 'double'通常大於1個字節。 – 2011-03-07 19:39:28

+0

好的結果,這個網站需要在提交答案之前進行同行代碼審查:) – pstrjds 2011-03-07 19:54:09

0

你的程序泄漏了你的分配,這可能是不好的 - 那個A=B的目的是爲了放置複製數組的代碼?

根據您的體系結構,可能會做一個沒有CPU循環的副本(通過調用DMA引擎或其他)。在標準C中,你別無選擇,只能循環。您可以自己做,也可以撥打memcpy(3)memmove(3)bcopy(3),如果您更喜歡使用庫的實現。

+0

是的,它用於複製過程,這是查看結果的示例代碼。我的acctual代碼是用於並行編程項目,它是笛卡爾拓撲中的矩陣向​​量乘法。我發送乘法結果與矢量派生類型。 – onatm 2011-03-07 19:29:51

0

至於說,你需要使用memcpy:

#define N 100 
int staticarray[N]; 
int *pointer = (int*) malloc(sizeof(int)*N*2); 
memcpy(staticarray, (pointer + ((N/2) - 1)), sizeof(int)*N);