2014-01-09 118 views
0

有一種方法,以二維陣列傳遞給一個函數,該尺寸是由如下所示的輸入來定義:傳遞二維陣列到功能

scanf("%d",&n); 
matrix[n][n]; 

我不想爲函數的第二個參數使用一個定義。

+0

如果向我們展示函數聲明,那麼我們很容易告訴您如何將2D數組傳遞給函數。 – haccks

回答

0

使用C99的variable length array功能。然後根據函數的參數及其大小將它傳遞給函數。

+0

爲什麼選擇投票? – haccks

+1

我懷疑:還有一個候選人不知道可以將VLA傳遞給一個函數,並因此低估任何(正確的)答案,斷言這可能是...>。< – 2014-01-09 13:33:30

+0

@ H2CO3; :(((同意 – haccks

1

在C 1999米的實施方式和用C 2011和支持可變長度數組實現方式中,可以用一個運行時間維度通過聲明函數這種方式傳遞數組:

ReturnType foo(size_t n, ElementType matrix[][n]) … 

在調用代碼,在獲得n後,可以用定義矩陣:

ElementType matrix[n][n]; 

和可以調用函數:

注:

  • ReturnTypeElementType是您選擇的類型的佔位符。 ReturnType可能是void
  • 要獲得size_t的定義,您應該#include <stddef.h>
  • 你應該這樣定義小數組。大多數C實現爲具有自動存儲持續時間的可變長度數組僅提供有限的空間,並且如果數組太大,則會溢出堆棧。
  • 如果您使用GCC進行編譯,您可以使用-std=c99-std=c11來請求C 1999或C 2011。有關其他選項,請參閱GCC documentation

如果數組很大,你可以把它定義這種方式來代替:

ElementType (*matrix)[n] = malloc(n * sizeof *matrix); 
if (!matrix) 
    Handle error. 

而且以後你必須釋放它:

free(matrix); 

如果你的C實現不支持變量長度數組,那麼您可以改爲爲空間分配n*n元素並手動索引數組(第i行的元素和第j列的元素將位於i*n+j),可能通過編寫一些輔助功能來幫助建立索引。在這種情況下,您可以將數組作爲指向元素類型的簡單指針傳遞給函數,而不是指向元素數組的指針。