1

セグメンテーション違反が発生し続けます:

#define MATRIX_SIZE 50

void fill_matrix(char *pointer[], char c) {
  int i, j;
  for (i = 0; i < MATRIX_SIZE; i++) {
    for (j = 0; j < MATRIX_SIZE; j++) {

      // tried many syntaxes

      // *(*(pointer + i) + j) = c;
      // *(pointer + i)[j] = c;
      // pointer[i][j] = c;
    }
  }
}

int main(int argc, char *argv[]) {
  char matrix[MATRIX_SIZE][MATRIX_SIZE];
  fill_matrix(&matrix, ' ');
}

2D 配列はヘルパー メソッドによってどのようにアクセスされることになっていますか? ポインタは私を混乱させます!

4

4 に答える 4

2

関数を次のように宣言するだけです。

void fill_matrix(char matrix[MATRIX_SIZE][MATRIX_SIZE], char c);

そして、このように呼び出します

fill_matrix(matrix, ' ');
于 2013-11-04T19:57:25.260 に答える
1

関数は、で定義しているのと同じタイプの配列を使用する必要がありますmain

#define MATRIX_SIZE 50

void fill_matrix(char pointer[][MATRIX_SIZE], char c) {
  int i, j;
  for (i = 0; i < MATRIX_SIZE; i++) {
    for (j = 0; j < MATRIX_SIZE; j++) {

      pointer[i][j] = c;
    }
  }
}

int main(int argc, char *argv[]) {
  char matrix[MATRIX_SIZE][MATRIX_SIZE];
  fill_matrix(matrix, ' ');
}
于 2013-11-04T19:57:05.783 に答える
1

宣言したオブジェクトとは異なるオブジェクトを関数に渡しています。あなたが宣言したのは二次元配列です。関数が期待するのは、1 次元配列へのポインターの配列です。1 つを別のものにシームレスにキャストすることはできません。修正するには、fill_matrix()(すべて C 固有の特異性を備えた) 2 次元配列を取るかmatrix、ポインターの配列として割り当てます。

于 2013-11-04T19:56:17.113 に答える
1
void fill_matrix(char pointer[][MATRIX_SIZE], char c) {

動作しますが、ポインター スタイルが必要な場合は次のようにします。

#define MATRIX_SIZE 50

void fill_matrix(char (*pointer)[MATRIX_SIZE], char c) {
  int i, j;
  for (i = 0; i < MATRIX_SIZE; i++) {
    for (j = 0; j < MATRIX_SIZE; j++) {
      pointer[i][j]= c;
    }
  }
}

int main(int argc, char *argv[]) {
  char matrix[MATRIX_SIZE][MATRIX_SIZE];
  fill_matrix(matrix, ' ');
}

&配列を渡すために使用する必要がないことに注意してください

また、この場合、ヘルパー関数は必要ないことに注意してください。

memset(matrix, ' ', sizeof matrix);

仕事をします

于 2013-11-04T20:00:20.220 に答える