Verständisfrage, länge eines Stringarray



  • Hey Leute,

    ich fange gerade mit der C-Programmierung an und versuche aus einem String, der einen Dateipfad enthält, den Dateinamen zu extrahieren. Dies ist vom grundsätzlichen auch kein Problem, allerdings muss ich dabei auf dynamische Arrays zurückgreifen. Das Array erstelle ich folgendermaßen:

    char *dateiname;
    dateiname = (char*) malloc(n);
    

    Wobei "n" die Anzahl der Character ist, die der Dateiname enthält. Um zu testen, ob das ganze auch so funktioniert wie gedacht, versuchte ich mit

    printf("%d",sizeof(dateiname)) //1
    printf(dateiname) //2
    

    die Größe herauszufinden. 1 Liefert dabei immer 4, egal wie groß n ist, was vermutlich daran liegt, dass ich sizeof() einen Pointer übergeben und ich somit die Größe des Pointers (4 Byte) wiedergegeben bekomme. 2 hingegen liefert mir einen Ausdruck auf der Konsole, der abhängig von n ist. Also je größer n, desto größer die ausgegebene Zeichenkette. Das Problem an der Sache ist allerdings, dass die ausgegebene Zeichenkette in keinster Weise mit n übereinstimmt.

    Deswegen die Frage, mache ich irgendwas bei der Deklaration meines Arrays falsch oder kann ich das einfach nur nicht mit diesen Methoden überprüfen? Wenn ich das Array über malloc(n) erstelle, müsste der mir doch genau n bytes reservieren auf die mein Pointer zeigt und dadurch müsste dateiname mit printf() genau n Character und nicht einige mehr wiedergeben !?

    Die Ausgabe von printf() sieht bei n=5 und dateiname[0-4] = 'A' in etwa so aus :
    AAAAA²²²²²1/21/21/2 mit weiteren kryptischen Zeichen.

    Ich hoffe mir kann das jemand näherbringen 😃



  • Hi.

    Also, ich auch noch weit vom Profi-Status entfernt, aber ich denke ich weiß, weshalb die Funktion immer 4 liefert.

    Also, die sizeof Funktion wird immer eine vier liefern, da es sich dabei ja um einen Pointer handelt, nicht um die Größe des Speichers, der sich dahinter verbirgt.



  • Ach ja... und wenn Du einen String basteln willst, muss das letzte Element Deines Arrays '\0' sein, sonst wird Dir Dein Rechner so lange alles ausgeben, bis er im Speicher mal auf '\0' stösst.
    Anschließend gibst Du den String mit:

    printf(%s\n", dateiname);
    

    aus.



  • Du musst unbedingt das Kapitel über Strings in deinem Buch/Tutorial durcharbeiten.

    Der Speicher den du von malloc bekommst wird nicht verändert. Das steht das drin, was das vorherige Programm dort hinterlassen hat.


  • Mod

    DirkB schrieb:

    Der Speicher den du von malloc bekommst wird nicht verändert. Das steht das drin, was das vorherige Programm dort hinterlassen hat.

    Naaa, vielleicht in MS-DOS 1.0. Heutzutage wirst du da drin höchstens die Reste deines eigenen Programmes finden. Das ändert natürlich nichts da dran, dass der Speicher uninitialisiert ist (dafür wäre calloc da) und hier auch sonst noch viel über Zeichenketten gelernt werden muss.


Anmelden zum Antworten