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?

War es hilfreich?

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 ints 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 ints).

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top