這不會是一個非常有用的答案,因爲你的代碼實際上並不表明所描述的問題;根據所呈現的內容,我發現cap
和cap2
在maximum_flow
函數末尾應該沒有相同的內容。但我想提供一些背景和建議。
我要去承擔cap
和flow
通過在main
的int
n
陣列,其中n
是在編譯時已知聲明爲n
。
請講師使用該接口的原因是,通過多維數組作爲函數參數是C.問題請記住,除非它是sizeof
或一元&
運營商的操作數,或是一個字符串被用來初始化另一個數組在聲明中,「T
」的「N元素數組」的表達式將被轉換(「衰減」)爲「指向T
的指針」的表達式,並且表達式的值將是第一數組的元素。
因此,假設一個聲明等
int cap[10][10];
int flow[10][10];
的表達式cap
和flow
將每個 「衰變」 鍵入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。
請在C中閱讀一些關於指針的課程:/在C中有** no **引用。 – Boiethios
這不是一個二維數組,它是一個堆碎片......的東西。而不是這個緩慢,容易出錯的查找表,使用二維數組。 [我如何在C中正確設置,訪問和釋放多維數組](http://stackoverflow.com/questions/12462615/how-do-i-correctly-set-up-access-and-free- a-multidimensional-array-in-c) – Lundin
'cap'和'flow'是如何聲明的? – interjay