Informationen von stat und statfs ausgeben


  • Mod

    Fabulus schrieb:

    Ah, so funktioniert es und hatte es in der Aufgabe auch so gelöst...
    Danke 🙂

    Verstehst du denn auch den Unterschied? Falls nicht, schnapp dir mal ein gutes C Buch.



  • Ich könnte es nicht richtig erklären.
    Mit char* fordert man Platz für einen Zeiger an (welcher auf jede Adresse im Speicher liegen kann) und char[10] fordert Platz für ein char-Array der Länge 10 an, dessen Adresse aber nicht mehr später verändert werden kann (außer natürich auf die Adressen der Elemente). So in etwa?


  • Mod

    Jain.

    char * ist ein Zeiger auf char, ja. Wenn du char * foo = "Beispiel"; machst, dann zeigt foo auf das Zeichenkettenliteral "Beispiel". Dessen Typ ist eigentlich const char[9] , d.h. man kann den Text nicht verändern und eigentlich dürfte ein (nicht const) char* da niemals draufzeigen. Ist aber eine Sonderregel in C, dass man das trotzdem darf, Zugeständnis an alten Code. Bei deinem Programm das nicht funktioniert hat, hast du genau dies getan und daher ging das auch schief.
    Wenn du statt dem Zeiger jedoch ein Array mit einem Zeichenkettenliteral initialisierst, dann ist das eine besondere Form der Initialisierung, bei der der Inhalt des Literals in das Array kopiert wird. Und da der Inhalt des Arrays (es ist ja selber char[9] und nicht const char[9]) veränderlich ist, funktioniert es damit. Das Weglassen der Größenangabe macht, dass der Compiler für uns die Zeichen zählt, das macht das Literal einfacher änderbar.

    Beachte jedoch, dass [] und * bei Funktionsargumenten beide die Bedeutung von Zeigern haben.



  • Ah, okay! Das hab ich verstanden! Eine Zeichenkette ist nicht veränderbar, wenn sie mit * definiert wurde, da nur auf die Zeichenkette gezeigt wird. Das wusste ich noch nicht.

    Dass Arrays und * beides Zeiger sind, war mir klar, deshalb habe ich beides geichermaßen verwendet.


  • Mod

    Fabulus schrieb:

    Dass Arrays und * beides Zeiger sind, war mir klar, deshalb habe ich beides geichermaßen verwendet.

    Normalerweise eben nicht! Nur bei Parameterübergabe an Funktionen steht die Arrayschreibweise für einen Pointer. Dir täte wirklich mal ein gutes C Buch gut.



  • Äh, klar, als Funktionsparameter mein ich doch, wie du vorher schon geschrieben hast. Würde sich ja auch sonst mit dem widersprechen, was ich einen Satz vorher geschrieben habe.

    C-Bücher habe ich nicht, nur C++, da ich bis vor kurzem nicht vor hatte, in C zu programmieren, aber dies hat sich wohl geändert. Bisher habe ich sonst zu C alles nur aus dem Netz.


  • Mod

    In C++ wäre der ganze Thread nach einer Zeile erledigt gewesen, aber das ist dir sicherlich klar (wenn nicht jetzt, dann wenn du mehr gelernt hast).



  • SeppJ schrieb:

    In C++ wäre der ganze Thread nach einer Zeile erledigt gewesen

    ja nee is klar 🤡


  • Mod

    DrGreenthumb schrieb:

    SeppJ schrieb:

    In C++ wäre der ganze Thread nach einer Zeile erledigt gewesen

    ja nee is klar 🤡

    😕 Ich verstehe nicht. Oder meinst du, dass die Frage gar nicht erst aufgekommen wäre? Ja, das wäre wohl so.



  • nee, ich meine, wieso sollte C++ hier hilfreich sein. Die String-Literale sind dort genauso wie in C. Und um irgendwelche C-Typen aus Linux-Headern *richtig* auszugeben, muss man auch in C++ den Typ kennen.


Anmelden zum Antworten