Wie kann ich ein 2D -Array ändern, das an eine Funktion übergeben wurde?
Frage
Warum gibt mir der folgende Code einen Segmentierungsfehler?
#define MAXROWS 10
#define MAXCOLS 10
void getInput (int *data[MAXROWS][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", rows, cols);
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", data[curRow][curCol]);
printf ("%d\n", *data[curRow][curCol]);
}
}
}
void main () {
int data[MAXROWS][MAXCOLS];
getInput (data);
}
Es scheint zu sein, dass die scanf
und printf
Aussagen lassen nicht den richtigen Datentyp übergeben, aber ich kann nicht herausfinden, was sie sollte sein.
Wie kann ich es so ändern, dass es richtig funktioniert?
Lösung
Dies erklärt eine Reihe von einer Reihe von MAXROWS
Zeiger -Arrays auf int
.
int *data[MAXROWS][MAXCOLS];
In einer Funktionsdefinition sind jedoch die Spitzenstufe (von beliebiger Größe) den Zeigern entsprechen, da Arrays beim Übergeben an eine Funktion immer auf Zeiger auf den Typ des Array -Mitglieds abfallen.
Ihre Funktionsdefinition entspricht also:
void getInput (int *(*data)[MAXCOLS])
dh ein Zeiger auf eine Reihe von MAXCOLS
Zeiger auf int
.
Wenn Ihr Code steht, initialisieren Sie nie einen der der int
Zeiger im Array, während Sie ein 2D -Array von bestehen int
s als Zeiger auf ein 2D -Array von int *
.
Was Sie wahrscheinlich passieren möchten, ist ein Zeiger auf eine Reihe von MAXCOLS
int
:
void getInput (int (*data)[MAXCOLS])
oder gleichwertig:
void getInput (int data[][MAXCOLS])
Dann machen Sie Folgendes:
int main(void)
{
int data[MAXROWS][MAXCOLS];
getInput(data);
return 0;
}
Sie übergeben dann Ihr 2D -Array als Zeiger an sein erstes Element (als Zeiger auf eine Zeile oder ein Array von MAXCOLS
int
s).
Wenn Sie sicherstellen, dass Änderungen sicherstellen, ändern Sie:
scanf ("%d", data[curRow][curCol]);
printf ("%d\n", *data[curRow][curCol]);
zu:
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
Überprüfen Sie auch Ihre Parameter hier:
scanf ("%d %d", &rows, &cols);
Sie müssen Zeiger geben, um rows
und cols
.
Stellen Sie sicher MAXROWS
oder MAXCOLS
.
Andere Tipps
Scanf akzeptiert die Adresse von Variablen, nicht den Inhalt davon:
void getInput (int data[][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", &rows, &cols);
//scanf ("%d %d", &rows, &cols);
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
}
}
}
Es gab einige verschiedene Probleme.
Erstens benötigen Sie beim Übergeben von Arrays an Funktionen nur die Definition von N-1-Dimensionen. Wenn Sie beispielsweise ein 3D -Array übergeben, würden Sie die Größe der letzten 2 Dimensionen in die Funktion Sig einfügen und die erste leer lassen.
foo(int threeD[][10][15]);
Zweitens übernimmt Scanf die Adresse des Arguments, die für Ihr Array so aussieht
&data[curRow][curCol]
Drittens sollten Sie immer den Bereich Ihrer Eingaben überprüfen, um sicherzustellen, dass er gültig ist:
if (rows > MAXROWS || cols > MAXCOLS) {
printf("Bad array dimensions\n");
return;
}
Viertens, immer mit allen Warnungen zusammengestellt - der Compiler warnt Sie vor der Grundlage dieser Dinge:
gcc -Wall pass_array.c -o pass_array
.
#include <stdio.h>
#define MAXROWS 10
#define MAXCOLS 10
void getInput (int data[][MAXCOLS]) {
int rows, cols;
int curRow, curCol;
printf ("How many rows and cols?");
scanf ("%d %d", &rows, &cols);
if (rows > MAXROWS || cols > MAXCOLS) {
printf("Bad array dimensions\n");
return;
}
for (curRow = 0; curRow < rows; curRow++) {
for (curCol = 0; curCol < cols; curCol++) {
scanf ("%d", &data[curRow][curCol]);
printf ("%d\n", data[curRow][curCol]);
}
}
}
int main () {
int data[MAXROWS][MAXCOLS];
getInput (data);
return 0;
}