/ / cヘルパー関数を使用して2次元配列を塗りつぶす - c

cヘルパー関数を使用して2次元配列を塗りつぶす - c

私はセグメンテーションフォールトを取得し続けます:

#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配列はヘルパーメソッドによってどのようにアクセスされるはずですか?ポインタが私を混乱させている!

回答:

回答№1は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);

仕事をする


回答№2については2

あなたの機能を次のように宣言してください:

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

それをこのように呼び出す

fill_matrix(matrix, " ");

回答№3の場合は1

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


回答№4の場合は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, " ");
}