Mehrdimensionale Arrays an Funktionen übergeben



  • Hi!

    Wenn man sich den assembler output des gcc ansieht, dann sieht man dass gcc für folgende funktionen exakt den selben code erzeugt:
    void func(int **a), void func(int *a[]), void func(int a[][n])

    Schreibt man bei der letzten funktion void func(int a[][]), dann beschwert sich gcc (Fehler: Feldtyp hat unvollständigen Elementtypen). Aber es ist ganz egal welche zahl man fuer die zweite dimensionsangabe einsetzt, gcc erzeugt immer den selben code. Was bringt also die angabe dieser zahl?

    Weiters warnt gcc auch wenn man der funktion void func(int **a) ein array a[10][10] übergeben möchte, obwohl wiederum der gleiche code erzeugt wird wie wenn man es void func(int a[][n]) übergeben würde.

    Sind diese unterschiedlichen behandlungen ein "service" für den programmierer mit denen der compiler auf mögliche unbeabsichtigte verwendung von gewissen konstrukten hinweisen möchte oder hat das noch einen anderen sinn?

    lg, mocky



  • Es stimmt, daß bei der Übergabe jeweils der selbe Wert übergeben wird (Adresse des Arrays), aber innerhalb der Funktion hat z.B. die Anweisung "*(a+1)" unterschiedliche Auswirkungen.

    void func(int **a)
    {
      // *(a+1) = *((char *)a + sizeof(int *))
    }
    
    void func(int *a[])
    {
      // wie oben, nur andere Schreibweise
    }
    
    void func(int a[][N]) // wobei N eine Konstante sein muß
    {
      // *(a+1) = *((char *)a + N*sizeof(int))
    }
    

    Bei den ersten beiden Varianten ist a ein Array von Zeigern auf int, während bei der 3. Variante a ein 2-dimensionales Array von int ist.
    Da bei C keine Laufzeitüberprüfung der Array-Grenzen stattfindet, entfällt der erste Array-Index.


Anmelden zum Antworten