Übergeben von mehrdimensionalen arrays als Funktionsargumente in C

StackOverflow https://stackoverflow.com/questions/4051

  •  08-06-2019
  •  | 
  •  

Frage

In C kann ich pass ein mehrdimensionales array an eine Funktion als einziges argument, wenn ich nicht weiß, was die Dimensionen des Arrays werden ?

Im übrigen hat mein mehrdimensionales array enthalten können andere Typen als Zeichenfolgen.

War es hilfreich?

Lösung

Sie können dies mit jedem Datentyp.Machen Sie einfach einen Zeiger-zu-Zeiger:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

Aber vergessen Sie nicht Sie haben immer noch malloc die variable, und es tut sich ein bisschen komplexer:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

Den code freigeben, die Struktur sieht ähnlich aus - vergessen Sie nicht, rufen Sie free() auf alles, was Sie malloced!(Auch in robuste Anwendungen sollten Sie überprüfen Sie die Rückkehr von malloc().)

Jetzt sagen wir, Sie möchten, übergeben Sie diese an eine Funktion.Sie können immer noch verwenden Sie die Doppel-pointer, weil Sie wahrscheinlich wollen, zu tun, Manipulationen an der Struktur der Daten, nicht der Zeiger auf Zeiger von Datenstrukturen:

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

Rufen Sie diese Funktion mit:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

Ausgabe:

My int is 6.

Andere Tipps

Vorbei an einer expliziten pointer auf das erste element des array-Dimensionen als separate Parameter.Für Beispiel, zu behandeln beliebig Größe 2-d-arrays von int:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

die aufgerufen werden würde, als

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

Dasselbe Prinzip gilt für die höhere dimension von arrays:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);

Können Sie erklären, Ihre Funktion als:

f(int size, int data[][size]) {...}

Der compiler wird dann alles tun, Zeiger-Arithmetik für Sie.

Beachten Sie, dass die Maße der Größen angezeigt werden muss bevor das array selbst.

GNU C ermöglicht argument Erklärung Spedition (im Fall, dass Sie wirklich brauchen, um passieren Abmessungen nach dem array):

f(int size; int data[][size], int size) {...}

Die erste dimension, obwohl Sie übergeben können, als argument zu, ist nutzlos, für den C-compiler (auch für den sizeof-operator, wenn angewendet über-array als argument übergeben wird, wird immer behandeln ist als ein Zeiger auf erstes element).

int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top