Warning beim Zugriff auf Pointer.



  • Hallo,

    der Compiler hat immer recht, aber warum ist die nachfolgende Warnmeldung und wie ich die korrigieren kann würde ich gerne wissen.

    Ich habe eine Funktion, die mir die Adresse der "char **" Variable anzeigt:

    void Func (char **a)
    {
     printf ("%p\n", a);
    }
    

    Ich habe noch eine Struktur:

    struct MyStruct
    {
     char *pcA;
     char pcB[10];
    };
    

    Die Funktion wird folgendermassen aufgerufen:

    //...
    
    struct MyStruct *myStruct;
    
    if (!(myStruct = (struct MyStruct *)calloc(1, sizeof(struct MyStruct))))
    {
        goto end;
    }
    
    // pcA und pcB werden initialisiert...
    
    // Ausgabe
    //
    Func (&(myStruct->pcA));
    Func (&(myStruct->pcB));
    
    //...
    

    Der 2.Aufruf meldet die Warnung. Warum und wie kann ich diese Warnmeldung korrigieren?

    Danke für die Tipps.



  • Du hast die Warnung vergessen. :p

    Meine Glaskugel sagt mir aber

    void Func(char **a) {
      printf("%p\n", (void*)a);
    }
    

    löst das Problem 🙂

    Übrigens solltest du calloc (genauso wie malloc) nicht casten und nimm lieber sizeof(*myStruct)

    http://www.c-plusplus.net/forum/viewtopic.php?t=206606



  • rüdiger schrieb:

    Du hast die Warnung vergessen. :p

    Stimmt's:

    gcc 2.95.3 schrieb:

    warning: passing arg 1 of `Func' from incompatible pointer type



  • &pcB ist kein Zeiger auf einen Char-Pointer, sondern ein Zeiger auf ein Char-Array der Größe 10. So weit geht der Array-zu-Pointer-Decay dann doch nicht. Das wäre auch ungültig, vgl. *a in der Funktion.



  • LordJaxom schrieb:

    So weit geht der Array-zu-Pointer-Decay dann doch nicht. Das wäre auch ungültig, vgl. *a in der Funktion.

    Den Satz habe ich leider nicht verstanden. 😕



  • Wenn ein Array von X gegeben ist, aber ein Zeiger auf X erwartet wird, zerfällt das Array zu einem Zeiger auf sein erstes Element (Decay = Zerfall). Damit geht die Größeninformation verloren.

    Zum Beispiel:

    char array[100];
    char *zeiger = array; // array zerfällt zu einem Zeiger auf das erste Element, wie in &array[0]
    

    In diesem Fall ist pcA ein Zeiger auf ein Char oder Char-Array, dem Du die Adresse eines (z.B. allokierten) Arrays zuweisen kannst. Diese Adresse steht selbst im Speicher, der Speicherort der Adresse hat also selbst eine Adresse (&pcA).

    Dein Array von 10 Zeichen steht hingegen selbst an der Stelle pcB, hier ist kein Zeiger beteiligt. Demnach kannst Du auch von Zeiger nicht die Adresse nehmen. Gültig wäre &pcB[0], das ist aber ein char* und kein char**



  • Besser wäre demnach:

    void Func(void* a)
    { 
      printf("%p\n", a);
    }
    

    solange in der Funktion nicht noch etwas spezielles mit einem char** gemacht wird. Dann müßten auch die beiden automatischen Zeigerkonvertierungen ohne Warnung klappen.


Log in to reply