2013-01-19 73 views
1

我想將兩個數組的笛卡爾積保存到一個多維數組中。C - 結構和列表

arr[number][0] - 從所述第二陣列數目

數=的sizeof(數組1)*的sizeof(數組2)

int main() { 
    int arr1[4] = {1, 4, 2, 3}; 
    int arr2[4] = {4, 1, 3, 3}; 
    int **outcomes = getProduct(arr1, 4, arr2, 4); 

    int i; 
    for(i = 0; i < 16; i++) 
     printf("%d", outcomes[i][0]); 

    getchar(); 
} 

int* getProduct(int arr1[], int size1, int arr2[], int size2) { 
    int **outcomes = (int *)malloc(sizeof(int)*16), count = 0, i, j; 

    for(i = 0; i < size1; i++) { 
     for(j = 0; j < size2; j++) { 
      outcomes[count][0] = arr1[i]; 
      outcomes[count][1] = arr2[j]; 
      count++; 
     } 
    } 
    return outcomes; 
}; 

但是,此代碼strangly場所,同時 -
arr[number][1]從所述第一陣列數在getProduct()函數的嵌套循環中。邏輯是好的,我的問題可能是與指針。

  1. 爲什麼我需要用兩個指針初始化多維數組?
  2. 這段代碼爲什麼不工作?
  3. 對此我有何建議?我該如何改進此代碼? (我沒有用C編寫太多的代碼,所以我不知道「好」代碼使用哪種結構)。因爲你是一個int指針(即int**)分配一個指針爲int(即int*)的指針
+4

這個代碼不應該編譯。確保您注意編譯器生成的警告/錯誤消息。 –

+0

你能至少幫我分配這個dwodimentional數組的內存嗎? :P – khernik

回答

1

功能getProduct會失敗。

Why do I need to initialize multidimentional arrays with two pointers? 

由於

int**(指針爲int指針) - 與此,我們可以訪問的任何行的元素和,這是不可能用單一指針(或一維陣列)

任何列

同樣int***可用於三維陣列或者換句話說指針指向int指針

To improve the code 

我想你的笛卡爾積函數應該是這個樣子

int** getProduct(int arr1[], int size1, int arr2[], int size2) { 
    int **outcome = malloc(sizeof(int*)*size1);   
    int i,j; 
    for(i = 0;i<size1;i++) 
    outcome[i] = malloc(sizeof(int)*size2); 
    for(i = 0; i < size1; i++) { 
     for(j = 0; j < size2; j++) { 
      outcome[i][j] = arr1[i] * arr2[j]; 
     } 
    } 
    return outcome; 
} 

和你的main()這樣的

int main() { 
    int arr1[4] = {1, 4, 2, 3}; 
    int arr2[4] = {4, 1, 3, 3}; 
    int **outcomes = getProduct(arr1, 4, arr2, 4); 

    int i,j; 
    for(i = 0; i < 4; i++){ 
    for(j = 0;j <4; j++){ 
     printf("%d ", outcomes[i][j]); 
    } 
    printf("\n"); 
    } 
    getchar(); 
} 
+0

* ptr是什麼?它從未使用過。 – khernik

+0

@khernik修改了刪除不必要的* ptr的答案。這應該適合你。 。 –

+0

int **'是**不是**「數組數組」。 http://c-faq.com/aryptr/pass2dary.html。 –