Warnung bei Zeigerübergabe



  • Hallo Leute,

    Also folgendes Problem:
    1.) Ich habe diese global verfügbare Funktion in datei1.c:

    int test(myStruct** ppst){...}
    

    2.) Ich habe ein lokales 2D-Array vom Typ "myStruct" in folgender Form in datei2.c:

    myStruct st2d[2][3];
    

    3.) Nun möchte ich in einer Funktion in datei2.c das 2D-Array "st2d" an test() aus datei1.c übergeben. Also rufe ich in datei2.c auf:

    test(st2d);
    

    Der Compiler (VS2003) bringt nun eine Warnung:

    datei2.c(xxx): warning C4047: 'function' : 'myStruct ** ' differs in levels of indirection from 'myStruct[2][3]'

    Und beim Ausführen des Programms erhalte ich eine Speicherzugriffsverletzung, wenn ich in test() auf das erste Element von ppst zugreifen will.

    Kann mir jemand hinsichtlich der Warnung weiterhelfen und aufzeigen, wie ich diese beheben kann?

    Vielen Dank im Voraus!
    MfG Matthias



  • Wenn du mit zwei- oder mehrdimensionalen Arrays arbeitest, mußt du der
    Funktion mitteilen, wie sich die Dimensionen verhalten, da der Compiler
    sonst nicht weiß, wo die eine "Spalte" aufhört und die nächste beginnt.

    richtig wäre:

    int test(myStruct ppst[2][3]){...}
    

    dies geht auch:

    int test(myStruct ppst[][3])
    

    Gruß mcr



  • Ach stimmt, da war ja mal was...
    Sorry, ist schon etwas her dass ich mit C gearbeitet habe (nur Java und C# in den letzten 3 Jahren). Ich kann mich dunkel erinnern, dass man es so machen muss, danke für den Hinweis!

    Gruß Matthias



  • Der Type von...

    myStruct [2][3]
    

    ...ist nicht das gleiche wie...

    myStruct**
    

    ...sondern

    myStruct*[3]
    

    Das heisst, es ist ein Pointer auf myStruct[3] Elemente.

    Der Übergabeparameter müsste...

    int test(myStruct (*ppst)[3]);
    

    ...oder...

    int test(myStruct ppst[][3]);
    

    ...lauten



  • für sowas sind typedefs ganz gut, dann hast du keine hardcodierten dimensionen im restlichen code. beispiel:

    typedef struct myStruct ms2d_t[2][3];
    

    object anlegen:

    ms2d_t st2d;  // <-- entspricht deinem 'myStruct st2d[2][3]'
    

    die funktion sieht dann so aus

    void test (ms2d_t st2d)
    {
      ....
      st2d[x][y].irgendwas = ...; // <-- zugriff auf ein struct-element
      ...
    }
    

    und an der übergabe ändert sich nichts

    test (st2d);
    

    übrigens sind arrays keine pointer und pointer sind keine arrays. siehe dazu auch campers posting in einem nachbarthread.
    🙂



  • Kein Zeiger ?

    #include <stdio.h>
    
    int main() 
    {
    	int i = 0;
    	int arr[10];
    
    	for ( i=0; i<10; i++ )
    		*(arr + i) = i; // Kein Zeiger ?
    	for ( i=0; i<10; i++ )
    		printf("%d\n", *(arr + i) ); // Kein Zeiger ?
    	return 0;
    }
    

    🙂



  • Arraypointer NOOB schrieb:

    Kein Zeiger ?

    richtig, wenn du damit 'arr' meinst --> 'arr' ist *kein* zeiger
    🙂



  • arr ist ein int[10] und kein Zeiger.


Anmelden zum Antworten