2016-05-23 70 views
0

因此,我正在處理一個任務,並且無法確定如何使用通過引用傳遞的這個2d數組。通過引用傳遞的2d數組的問題C

我所給出的是這樣的

int main(){ 
//cap and flow initialized 
maximum_flow(1000, &(cap[0][0]), &(flow[0][0])); 

} 

所以我希望到帽的內容複製到我動態分配的另一個二維數組,但擊中了錯誤之後,我決定打印出來我在價值觀cap2capacity,我沒有回到我應該的所有值。

void maximum_flow(int n, int *capacity, int *flow){ 
    int **cap2; 
    cap2 = (int**) malloc(sizeof(int *)*n); 
    for (i = 0; i < n; i++) 
    { 
     cap2[i] = (int*) malloc(sizeof(int)*n); 
    } 

    for (i = 0; i < n; i++) 
    { 
     for (j = 0; j < n; j++) 
     { 
      cap2[i][j] = (*(capacity + i*n + j)); 
      (*(flow + i*n + j)) = 0; 
     } 
    } 
} 
+6

請在C中閱讀一些關於指針的課程:/在C中有** no **引用。 – Boiethios

+4

這不是一個二維數組,它是一個堆碎片......的東西。而不是這個緩慢,容易出錯的查找表,使用二維數組。 [我如何在C中正確設置,訪問和釋放多維數組](http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free- a-multidimensional-array-in-c) – Lundin

+0

'cap'和'flow'是如何聲明的? – interjay

回答

1

這不會是一個非常有用的答案,因爲你的代碼實際上並不表明所描述的問題;根據所呈現的內容,我發現capcap2maximum_flow函數末尾應該沒有相同的內容。但我想提供一些背景和建議。

我要去承擔capflow通過在mainintn陣列,其中n是在編譯時已知聲明爲n

請講師使用該接口的原因是,通過多維數組作爲函數參數是C.問題請記住,除非它是sizeof或一元&運營商的操作數,或是一個字符串被用來初始化另一個數組在聲明中,「T」的「N元素數組」的表達式將被轉換(「衰減」)爲「指向T的指針」的表達式,並且表達式的值將是第一數組的元素。

因此,假設一個聲明等

int cap[10][10]; 
int flow[10][10]; 

表達式capflow將每個 「衰變」 鍵入int (*)[10](指針的int 10元件陣列)。所以,如果你寫你的函數調用作爲

maximum_flow(1000, cap, flow); 

則函數定義就必須寫成

void maximum_flow(int n, int (*cap)[10], int (*flow)[10]) { ... } 

void maximum_flow(int n, int cap[][10], int flow[][10]) { ... } 

在功能方面參數聲明,T a[][N]T (*a)[N]表示相同的薄G。

的外部尺寸的大小具有在數組指針聲明中指定,並且問題是一個指向10個元素的數組是一個不同的,不兼容的指針類型到任何 - 數值不超過10個元素的數組;因此,maximum_flow只能用於N x 10個元素的陣列,限制了它的實用性。解決此問題的一種方法是讓函數接收到第一個元素的顯式指針,並將該指針視爲尺寸爲N * M的一維數組。

長話短說,因爲你對待你的輸入參數爲一維數組,你可能會更好過創建cap2爲一維數組,以及:

int *cap2 = malloc(sizeof *cap2 * n * n); 
... 
cap2[i * n + j] = capacity[i * n + j]; // use array subscript notation instead 
flow[i * n + j] = 0;     // of explicit dereferences 

從您發佈的代碼,它的不清楚maximum_flow應該做什麼,也不知道爲什麼您需要cap2。另請注意,在某些時候,您需要將free的內存分配給cap2,否則您會發生內存泄漏。

如果您使用的是C99或更高版本的編譯器,你應該能夠使用可變長度數組,而不是malloc

int cap2[n * n]; // or int cap2[n][n], but like I said above, if you're 
       // treating your inputs as 1D arrays, you should also treat 
       // cap2 as a 1D array. 

一VLA的好處是,你不需要在編譯時知道大小,並且它的處理方式與其他任何auto變量一樣,這意味着當函數退出時,它的內存將被釋放。

VLA的缺點是,你不能用它作爲任何東西,但是一個局部變量;您不能將VLA作爲結構或聯合成員,也不能聲明一個static或文件範圍。你也不能明確地初始化一個VLA。