私はセグメンテーションフォールトを取得し続けます:
#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は1void 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, " ");
}