String



  • Ja, tut mir Leid, da war einiges daneben. Aber ebenfalls vernünftig waren doch meine Hinweise, strcpy zu nutzen, um Strings zu kopieren, und dass all die ganzen Zuweisungen niemals Kopien machen. Egal, ist ja jetzt klar, danke.



  • meinst du mit mehreren Strings etwa sowas ?

    char* array[5][];
    

    ein Zeiger kann doch immer nur auf eine einzige Adresse zeigen ?



  • blurry333 schrieb:

    meinst du mit mehreren Strings etwa sowas ?

    char* array[5][];
    

    ein Zeiger kann doch immer nur auf eine einzige Adresse zeigen ?

    char** ist ein Zeiger auf einen Zeiger. charr** zeigt auf den Anfang eines Arrays aus Zeigern. Und jeder Zeiger in diesem Array zeigt auf einen String.



  • mein Compiler schluckt das problemlos.

    void funk(char* x){}
    
    //main
    char* array[5][10];
    funk(array);
    


  • blurry333 schrieb:

    mein Compiler schluckt das problemlos.

    void funk(char* x){}
    
    //main
    char* array[5][10];
    funk(array);
    

    Kompilierst Du das als C-Code?



  • ja als C code mit Eclipse



  • blurry333 schrieb:

    ja als C code mit Eclipse

    Und warum fragst Du im C++-Forum? Nach knapp 450 Posts sollte man wissen, welches Forum man benutzt...



  • blurry333 schrieb:

    meinst du mit mehreren Strings etwa sowas ?

    char* array[5][];
    

    Das ist kein C++ (auch kein C).

    blurry333 schrieb:

    ein Zeiger kann doch immer nur auf eine einzige Adresse zeigen ?

    Eine Zeigervariable speichert höchstens eine Adresse, ja.

    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char **argv)
    {
      for (int i=0; i<argc; ++i) {
        if (i>0) std::cout << ' ';
        std::cout << argv[i];
      }
      std::cout << std::endl;
    }
    

    Speicherlayout (Beispiel mit sizeof(char*)==4):

    Name:      argc        argv          argv[0] argv[1] argv[2]
    Adresse:   egal        egal            152     156     160
             +-------+   +-------+      +-------+-------+-------+
    Inhalt:  |   3   |   |  152  |      |  400  |  412  |  405  |
             +-------+   +-------+      +-------+-------+-------+
    
    Adresse:  400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
             +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    Inhalt:  | w | h | a | t |\0 | f | * | c | k | ? | ! |\0 | t | h | e |\0 |
             +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    

    Ausgabe:

    what the f*ck?!
    

    Man beachte: argv zeigt nicht auf (den Anfang) eine(r) Zeichenkette.



  • [quote="krümelkacker"]

    blurry333 schrieb:

    Man beachte: argv zeigt nicht auf (den Anfang) eine(r) Zeichenkette.

    Da bekomm ich aber was anderes raus :

    printf("Adresse in argv: %x\n",argv);
    
    	printf("Adresse von argv[0]: %x",&argv[0]);
    

    Ausgabe:

    Adresse in argv: 3e3c48
    Adresse von argv[0]: 3e3c48



  • [quote="blurry333"]

    krümelkacker schrieb:

    blurry333 schrieb:

    Man beachte: argv zeigt nicht auf (den Anfang) eine(r) Zeichenkette.

    Da bekomm ich aber was anderes raus :

    printf("Adresse in argv: %x\n",argv);
    
    	printf("Adresse von argv[0]: %x",&argv[0]);
    

    Ausgabe:

    Adresse in argv: 3e3c48
    Adresse von argv[0]: 3e3c48

    Ersteres gibt nicht die adresse von argv aus, sondern die vom inhalt von argv. Das zweite ebenfalls. &argv ist die adresse von argv, weder argv noch &argv[0]



  • printf("Adresse in argv: %x -> %x\n",*argv, argv);
    printf("Adresse von argv[0]: %x\n",&argv[0]);
    printf("Adresse von argv[1]: %x",&argv[1]);
    
    Adresse in argv: 3e2441 -> 3e24c8
    Adresse von argv[0]: 3e24c8
    Adresse von argv[1]: 3e24cc
    

    greetz KN4CK3R



  • blurry333 schrieb:

    krümelkacker schrieb:

    Man beachte: argv zeigt nicht auf (den Anfang) eine(r) Zeichenkette.

    Da bekomm ich aber was anderes raus :

    printf("Adresse in argv: %x\n",argv);
      printf("Adresse von argv[0]: %x",&argv[0]);
    

    Ausgabe:

    Adresse in argv: 3e3c48
    Adresse von argv[0]: 3e3c48

    Das klingt so, als würdest Du glauben, hier einen Widerspruch aufgezeigt zu haben. Dem ist nicht so. zeiger==&zeiger[0] ist immer wahr (Tautologie), unabhängig davon, wohin der Zeiger zeigt. Der Standard definiert zeiger[index] äquivalent zu *(zeiger+index). &zeiger[0] ist daher äquivalent zu &*zeiger, wobei sich & und * quasi wegkürzen.

    Cachus schrieb:

    Ersteres gibt nicht die adresse von argv aus, sondern die vom inhalt von argv.

    Die Adresse von argv ist eigentlich noch weniger interessant.


Anmelden zum Antworten