Convert geht nicht.



  • Hallo

    Ich habe eine Funktion, die als Parameter einen Zeiger auf eine char Array Struktur verlangt:

    VOID Changed(char * Name[]);
    

    Wie muss ich das ganze nun beim Funktionsaufruf angeben?

    char myText[] = "Nollier";
    
    		Changed(&myText);
    

    Geht nicht. Auch diverse andere Varianten wollten nicht ganz.
    Kann mir jemand weiter helfen?



  • char* c[] == char** c
    char myText[] = "Nollier" == Array nicht konstanter Zeichenkette.
    

    Das Problem ist, dass die Deklaration char myText[] ein array einleitet. An der Adresse von myText befindet sich bereits das erste Objekt (hier ein char). Daher ist "&myText" so nicht auswertbar und das gleiche wie "myText".

    "&myText" würde nur gehen, wenn "myText" ein Pointer wäre. Ist es aber nicht, sondern die Adresse des ersten Elements dieses arrays. Er kann also nicht konvertieren von char(*)[9] zu char**.

    Wie wäre es die Deklaration von changed so abzuändern, das es keinen Pointer auf einen Char-Pointer erwartet, sondern einfach nur einen Char-Pointer?

    #include <stdio.h>
    
    void changed(char c[]) {
    	printf("%s\n", c);
    }
    
    int main()
    {
    	char c[] = "MeinText";
    	changed(c);
    
    	return 0;
    }
    


  • 'Changed' : cannot convert parameter 1 from 'char (*)[7]' to 'char **'

    Gruss,
    converter



  • Hab mal editiert. Wenn du changed nicht ändern kannst, dann musst du vorher einen Pointer deklarieren.

    #include <stdio.h>
    
    void changed(char* c[]) {
    	printf("%s\n", *c);
    }
    
    int main()
    {
    	char c[]  = "MeinText";
    	char* ptr = c;
    	changed(&ptr);
    
    	return 0;
    }
    


  • Ah perfekt!
    Ich danke dir 😉



  • Bitte erkenne aber auch warum es auf deine Art nicht ging.

    char c[] = "Hallo";
    

    "c" ist implizit die Adresse des ersten Char-Elements ('H'). Wenn du nun also den &-Operator benutzt ... was soll da passieren? Du hättest gerne die Adresse der Adresse.

    Das ist so als ob du folgendes schreiben würdest:

    char* p = &4;
    

    Was soll da schon passieren?



  • FrEEzE2046 schrieb:

    Bitte erkenne aber auch warum es auf deine Art nicht ging.

    char c[] = "Hallo";
    

    "c" ist implizit die Adresse des ersten Char-Elements ('H'). Wenn du nun also den &-Operator benutzt ... was soll da passieren? Du hättest gerne die Adresse der Adresse.

    Das ist so als ob du folgendes schreiben würdest:

    char* p = &4;
    

    Was soll da schon passieren?

    Na ja, die Adresse eines int-Literals macht natürlich wenig Sinn, klar. Aber die Adresse einer Adresse ist je nach Fall durchaus sinnvoll. Das ist dann der berühmt-berüchtigte Zeiger auf einen Zeiger.

    Bei diesem Beispiel geht es nicht anders. Schließlich ist ein übergebener Zeiger nur eine Kopie, will man also die Zeigervariable selbst befüllen, muss man einen Zeiger darauf übergeben:

    void AllocHandle(T_Handle **ppHandle) {
      *ppHandle=malloc(sizeof(**ppHandle));
    }
    


  • _matze schrieb:

    Das ist dann der berühmt-berüchtigte Zeiger auf einen Zeiger.

    Wie? Das sagte ich doch oder? Aber um einen Zeiger auf einen Zeiger zu haben, muss ich auch einen Zeiger deklarieren. Nur den &-Operator auf eine Adresse zu schmeißen bringt nicht viel. Was soll da auch passieren?



  • FrEEzE2046 schrieb:

    _matze schrieb:

    Das ist dann der berühmt-berüchtigte Zeiger auf einen Zeiger.

    Wie? Das sagte ich doch oder? Aber um einen Zeiger auf einen Zeiger zu haben, muss ich auch einen Zeiger deklarieren. Nur den &-Operator auf eine Adresse zu schmeißen bringt nicht viel. Was soll da auch passieren?

    Ist ja schon gut. 😃

    Dies hier

    FrEEzE2046 schrieb:

    was soll da passieren? Du hättest gerne die Adresse der Adresse.

    hatte sich nur so angehört, als ob die Adresse einer Adresse generell sinnlos wäre. Das wollte ich nicht so stehen lassen. 🙂



  • _matze schrieb:

    hatte sich nur so angehört, als ob die Adresse einer Adresse generell sinnlos wäre. Das wollte ich nicht so stehen lassen. 🙂

    Ist schon richtig. Generell sinnlos ist das auf gar keinen Fall. In seinem Beispiel aber schon^^.


Anmelden zum Antworten