pointer-string funktioniert nicht



  • Die folgende Funktion will bei mir nicht funktionieren, obwohl printf das richtige ausgibt..
    Und wenn ich anstatt des *o = '\0'; das, was in den Kommentar-Tags steht, nehme, sind später lauter ² im String, ansonsten ist da gar nichts..

    char *foo(int c) {
    char *o;
    o = (char *)malloc(5);
    while(c > 2) {
    *o++ = rand() % 100 + 50;
    /*printf("%c", *(o-1));*/
    *o++ = rand() % 100 + 50;
    /*printf("%c", *(o-1));*/
    *o++ = rand() % 100 + 50;
    /*printf("%c", *(o-1));*/
    *o++ = rand() % 100 + 50;
    /*printf("%c", *(o-1));*/
    c -= 3;
    }
    *o = '\0';
    /**(o + 5) = '\0';
    /*printf("%s", o);*/
    return o;
    }
    
    int main(void) {
    	printf("%s", foo(5));
    	getchar();
    	return 0;
    }
    

    Wenn ich die Funktion umschreibe, klappt alles auf einmal, aber warum das so ist, weiß ich nicht?

    char *foo(int c) {
    char *o;
    char *k;
    o = (char *)malloc(5);
    k=o;
    while(c > 2) {
    *k++ = rand() % 100 + 50;
    *k++ = rand() % 100 + 50;
    *k++ = rand() % 100 + 50;
    *k++ = rand() % 100 + 50;
    c -= 3;
    }
    *k = '\0';
    return o;
    }
    


  • Du änderst in der ersten Version ja auch die Pointer-Variable 'o' und gibst diese zurück, so daß diese dann auf einen undefinierten Speicherbereich zeigt (hinter deinen allokierten 5 Bytes).
    Und wofür ist eigentlich diese komische Schleife???
    Ich würde ja einfach eine Zählschleife über die Anzahl der einzutragenden Zeichen machen:

    char *o = malloc(5);
    char *k = o;
    int i;
    for(i=0; i<4; i++)
    {
      *k++ = rand() % 100 + 50;
    }
    *k = '\0';
    
    return o;
    


  • ich versteh das auch nicht ehrlich gesagt... erklär das mal eine genauer..



  • Der Code soll eigentlich nur ein Beispiel darstellen ^^

    Aber wo ändere ich denn o?

    "so daß diese dann auf einen undefinierten Speicherbereich zeigt (hinter deinen allokierten 5 Bytes)"

    Wieso denn dahinter?..

    Irgendwie verstehe ich das nicht 😞



  • ptrnap schrieb:

    Aber wo ändere ich denn o?

    Da z.B. mit dem ++-Operator:

    *o++ = rand() % 100 + 50;
    

    Allgemeiner Rat: Nicht mit Pointerarithmetik arbeiten wo normaler Zugriff über [] genauso gut ist.



  • Ich dachte, dass sähe so aus:

    Allokierte Bytes:
    1        2        3        4        5
    
    *o     *++o     *(o+1)   *++(o+1)   *o
    
    *o++   *o++     *o       *(o+1)     *(o+2)
    

    Und wenn ich o dann inkrementiere, dass es dann auf den nächsten allokierten Byte zeigt..



  • Wie kann ich das denn machen, ohne einen zweiten Zeiger zu erzeugen?



  • Und wieso stimmt das oben genannte Bild nicht?



  • *hust*



  • Frohes Fest euch allen!

    PS: ...


Anmelden zum Antworten