webentwicklung-frage-antwort-db.com.de

Wie kann ein 2D-Array mit einem Zeiger in C übergeben werden?

Ich lerne C und habe Probleme, den Zeiger eines 2D-Arrays an eine andere Funktion zu übergeben, die dann das 2D-Array druckt. Jede Hilfe wäre dankbar. 

int main( void ){
    char array[50][50];
    int SIZE;

    ...call function to fill array... this part works.

    printarray( array, SIZE );
}

void printarray( char **array, int SIZE ){
    int i;
    int j;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}
32
user1362058

char ** repräsentiert kein 2D-Array - es wäre ein Array von Zeigern auf Zeiger. Sie müssen die Definition von printarray ändern, wenn Sie ein 2D-Array übergeben möchten:

void printarray( char (*array)[50], int SIZE )

oder gleichwertig:

void printarray( char array[][50], int SIZE )
24
Carl Norum

In main () wird die Variable "array" als deklariert 

char array[50][50];

Dies ist ein 2500 Byte großes Datenstück. Wenn das "Array" von main () übergeben wird, ist dies ein Zeiger auf den Anfang dieser Daten. Es ist ein Zeiger auf ein Zeichen, von dem erwartet wird, dass es in Zeilen von 50 organisiert ist.

In der Funktion printarray () deklarieren Sie jedoch

 char **array

"array" ist hier ein Zeiger auf einen "char * pointer".

@Lucus Vorschlag von "void printarray (char array [] [50], int SIZE)" funktioniert, mit der Ausnahme, dass es nicht generisch ist, dass Ihr SIZE-Parameter muss 50 ist.

Idee: Besiege den Typ des Parameter-Arrays in printarray ()

void printarray(void *array, int SIZE ){
    int i;
    int j;
    char *charArray = (char *) array;

    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", charArray[j*SIZE + i] );
        }
        printf( "\n" );
    }
}

Eine elegantere Lösung besteht darin, das "Array" in main () zu einem Array von Zeigern zu machen.

// Your original printarray()
void printarray(char **array, int SIZE ){
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}

// main()
char **array;
int SIZE;
// Initialization of SIZE is not shown, but let's assume SIZE = 50;
// Allocate table
array = (char **) malloc(SIZE * sizeof(char*));
  // Note: alternative syntax
  // array = (char **) malloc(SIZE * sizeof(*array));
// Allocate rows
for (int row = 0; row<SIZE; row++) {
  // Note: sizeof(char) is 1. (@Carl Norum)
  // Shown here to help show difference between this malloc() and the above one.
  array[row] = (char *) malloc(SIZE * sizeof(char));
    // Note: alternative syntax
    // array[row] = (char *) malloc(SIZE * sizeof(**array));
  }
// Initialize each element.
for (int row = 0; row<SIZE; row++) {
  for (int col = 0; col<SIZE; col++) {
    array[row][col] = 'a';  // or whatever value you want
  }
}
// Print it
printarray(array, SIZE);
...
5
chux

Da C99 Arrays mit dynamischer Größe unterstützt, ist der folgende Stil einfach praktischer, um ein 2-dim-Array zu übergeben:

void printarray( void *array0, int SIZE ){
    char (*array)[SIZE] = array0;
    int i;
    int j;
    for( j = 0; j < SIZE; j++ ){
        for( i = 0; i < SIZE; i ++){
            printf( "%c ", array[j][i] );
        }
        printf( "\n" );
    }
}
1
Simon Woo

Sie können das 2D-Array problemlos mit einem Doppelzeiger übergeben.

  void printarray( char **array, int n)
  {
     int i, j;
     for(i=0; i<n; i++ )
     {
         for(j=0; j<n; j++)
         {
            printf("%c ", array[i][j] );
         }
        printf( "\n" );
     }
  }

  int main()
  {
      int n = 2;
      int i, j;

      char **array = (char **) malloc(n * sizeof(char*));

      for (i=0; i<n; i++) 
      {
        array[i] = (char *) malloc(n* sizeof(char));
      }

     for (i=0; i<n; i++)
     {
       for (j=0; j<n; j++)
       {
           scanf("%c ", &array[i][j]);
       }
     }

     printarray(array, n);

     return 0;
  }

Vollständiger Code: Ideone

0
rashedcs