簡體   English   中英

將二維數組傳遞給 C 中的函數

[英]Passing 2-d array to a function in C

我正在嘗試創建一個函數,該函數根據變量名稱以及行數和列數(在本例中為 n)來初始化隨機二維方陣。 此代碼返回“分段錯誤”錯誤,我不知道為什么。 我試過在函數 initM 中的 if-else 中使用 &,但隨后返回“錯誤:左值需要作為賦值的左操作數”有誰知道如何使它工作?

void initM (int n, int **matrix){
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            if (i == j) matrix[i][j] = 101;
            else matrix[i][j] = (rand() % 101);
        }
    }
}

void main (int argc, char *argv[]){

    int n = atoi(argv[1]);

    int **matrix = (int **)malloc(n*sizeof(int));
    for(int i = 0; i < n; i++) matrix[i] = (int *)malloc(n*sizeof(int));

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

    for (int i = 0; i < n; i++) free(matrix[i]);
    free(matrix);
}
int **matrix = (int **)malloc(n*sizeof(int));

它應該是

int **matrix = malloc(n*sizeof(int*));

在您的架構中, sizeof(int)sizeof(void*)的值不同。

不需要轉換 malloc 的輸出,因為 void* 可以像任何其他指向對象的指針一樣正確地表現。

int **matrix = (int **)malloc(n*sizeof(int));

主要問題是sizeof (int)與系統上的sizeof (int *) ,因此您沒有分配足夠的空間。 上面的調用可以改寫為

int **matrix = malloc( n * sizeof *matrix );

強制轉換是不必要的1 ,而sizeof *matrix == sizeof (int *) 2

同樣,您可以將每個matrix[i]分配為

matrix[i] = malloc( n * sizeof *matrix[i] ); // sizeof *matrix[i] == sizeof (int)

您應該始終檢查malloccallocrealloc調用的結果。 雖然失敗很少見,但它們可能會發生:

int **matrix = malloc( n * sizeof *matrix );
if ( matrix )
{
  for ( i = 0; i < n; i++ )
  {
    matrix[i] = malloc( n * sizeof *matrix[i] );
    if ( matrix[i] )
      // do stuff
  }
}

最終 nit- main返回int ,而不是void 除非您的編譯器專門將void main( int, char ** )為有效簽名,否則使用它會調用未定義的行為 您的代碼可能運行得很好,但在某些(公認的舊的或古怪的)平台上,將main鍵入為void會導致問題。


  1. 除非您將此代碼編譯為 C++ 或使用古老的 C89 之前的編譯器。
  2. sizeof是一個operator ,而不是一個函數 - 只有在操作數是類型名稱時才需要括號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM