Funktion char *fgets(char *s, int size, FILE *stream);



  • Gah! Weil du weder Speicherverwaltung, noch Zeichenketten noch Literale noch Arrays verstanden hast.

    Das hab ich auch gemerkt, deswegen stell ich ja solche Fragen 😉
    Aber gut, ich schau mir erstmal das ganze nochmal an. 🕶



  • Fange erstmal mit klassischen Arrays an, malloc und so Zeugs schaue dir danach an.



  • So, jetzt ist eine Frage aufgekommen :):

    int *p;
    p = malloc(sizeof(short));
    p = 2577;
    

    Warum geht das? Wird der Speicherbereich sozusagen automatisch erweitert? D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?


  • Mod

    qwert_zuiopü schrieb:

    Warum geht das?

    Weil du nicht den blassesten Schimmer hast, was du da getan hast. Lern Grundlagen!

    Du hast deinem Zeiger einen anderen Wert zugewiesen, er zeigt jetzt auf Adresse 2577. Es ist zwar technisch erlaubt eine Ganzzahl in einen Pointer umzuwandeln, aber praktisch niemals sinnvoll (außer vielleicht bei 0). Dein Compiler wird dich auch ganz sicher vor dem Unsinn warnen, wenn du ihm nur sagen würdest, dass er dich vor typischen Anfängerfehler bewahren soll.

    Wird der Speicherbereich sozusagen automatisch erweitert? D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?

    Das ist unangenehm nahe an dem was man "magisches Denken" nennt.



  • Sorry, beim Abschreiben ist mir ein Fehler passiert 🤡

    die letzte Zeile sollte

    *p = 2577

    heißen.



  • qwert_zuiopü schrieb:

    die letzte Zeile sollte

    *p = 2577
    

    heißen.

    Damit ist es dann sogar undefiniertes Verhalten, während es vorher nur fachlicher Unsinn war.
    Du stocherst nur im Nebel rum und weißt nicht, was du tust.



  • also laut allen meinen Tutorials ist die Anweisungsfolge

    int *p;
    p = malloc(sizeof(int));
    *p = 2;

    absolut korrekt. Mir geht es darum, was passiert, wenn ich zu wenig Speicher anfordere. Insofern kannst du höchstens behaupten ich würde mich mit malloc und der Speicherverwaltung nicht auskennen 😉 .



  • Richtig irgendwo abschreiben kannst du auch nicht.
    Oben schriebst du noch sizeof(short), jetzt aber sizeof(int).
    Falls es dir noch keiner gesagt hat: das ist ein Unterschied bei der C Programmierung.



  • dann verstehst du scheinbar den Grund meines Themas hier nicht. Denn auf genau den Unterschied möchte ich hinaus..
    Ich fordere Speicher für einen Character an, schreibe dann aber einen größeren Integer rein. Meine Frage ist nun, ob der Integerwert quasi "instabil" ist, also im Prinzip nicht vorhergesagt werden kann.


  • Mod

    qwert_zuiopü schrieb:

    Ich fordere Speicher für einen Character an

    Diablo 3?

    Meine Frage ist nun, ob der Integerwert quasi "instabil" ist, also im Prinzip nicht vorhergesagt werden kann.

    Das hat Wutz direkt beantwortet.

    Wutz schrieb:

    Damit ist es dann sogar undefiniertes Verhalten, während es vorher nur fachlicher Unsinn war.



  • Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Außerdem war meine einige Posts weiter oben getätigte Aussage "D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?" vollkommen richtig.

    Der Ton in diesem Forum ist schon sonderbar.. Vielleicht solltet ihr euren Stress wo anders abbauen.. Nehmt euch ein Beispiel an "java-forum.org" ...



  • "Character" (char) nicht gleich "short" und "int" ist wieder was anderes. In einen "short" passt 2577 ohne probleme rein.

    short s;
    s=70000; // kein undefiniertes Verhalten, einfach eine Verkürzung des Wertes
    
    int *p;
    p = (int*)malloc(sizeof(short)); //führt zu undefiniertem verhalten
    p = (int*)malloc(sizeof(int)); //ist richtig
    *p = 2577;
    

    Du solltest dir dringend nochmal die datentypen anschauen die es gibt, da gibts unterschiede im wertebereich..

    Ich hoffe damit habe ich jetzt alles abgedeckt was du meinen könntest.



  • Sehr schön, danke; auch für deinen freundlichen Ton 👍



  • Du bist ein klassischer Noob.
    Von nichts Ahnung, lernunwillig und gebrauchst Fachbegriffe ohne sie verstanden zu haben. Deine provozierenden Fragestellungen um doch noch eventuell jemanden Fachwissen zu entlocken, das du dann sowieso ignorierst, ist leicht durchschaubar.
    Gehe doch in das Forum deiner Wahl oder wende dich direkt an den Tutorialmacher, wenn es Fragen offenlässt.


  • Mod

    qwert_zuiopü schrieb:

    Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Nein, das war wunderbar definiert vorher, nur Unsinn.

    Außerdem war meine einige Posts weiter oben getätigte Aussage "D.h. ich kann nicht davon ausgehen, dass der Wert immer bei 2577 bleibt, weil zufällig eine andere Variable den Speicherplatz erhalten kann?" vollkommen richtig.

    Nein. Deine Begründung ist Quatsch.

    DarkShadow44 schrieb:

    int *p;
    p = (int*)malloc(sizeof(short)); //führt zu undefiniertem verhalten
    p = (int*)malloc(sizeof(int)); //ist richtig
    *p = 2577;
    

    Zeile 2 ist wunderbar definiert, nur fachlicher Unsinn. Zeilen 2 und 3 haben beide einen fachlich unsinnigen Cast.

    qwert_zuiopü schrieb:

    Sehr schön, danke; auch für deinen freundlichen Ton 👍

    War aber falsch.



  • Was war denn genau falsch von DarkShadow44?

    @Wutz: Hast du auch nur einen einzigen Beleg für deine Aussage, ich sei "lernunwillig"? Nur weil du so lange gebraucht hast, meine Frage zu verstehen?


  • Mod

    qwert_zuiopü schrieb:

    @Wutz: Hast du auch nur einen einzigen Beleg für deine Aussage, ich sei "lernunwillig"?

    Zum Beispiel das hier:

    Was war denn genau falsch von DarkShadow44?

    Deckt sich wunderbar mit

    Wutz schrieb:

    doch noch eventuell jemanden Fachwissen zu entlocken, das du dann sowieso ignorierst

    Denn ich habe schon erklärt, was bei Darkshadow faslch ist, aber dafür müsstest du schon 1-2 Sätze aufmerksam lesen. Oder:

    qwert_zuiopü schrieb:

    Wenn schon, dann war es sowohl vorher als auch nachher undefiniertes Verhalten und nicht lediglich fachlicher Unsinn, wie von Wutz behauptet.

    Wutz erklärt es richtig, du lehnst es pauschal ab, weil er seinen Beitrag nicht mit Blümchen und rosa Vögelchen und ganz vielen "Bitte bitte guter qwert_zuiopü, hör mir zu!" verunziert.

    Ich fürchte, dein Verhalten macht für deine Sache keine gute Werbung. Siehe auch:
    http://www.tty1.net/smart-questions_de.html#keepcool
    http://www.tty1.net/smart-questions_de.html#not_losing



  • Denn ich habe schon erklärt, was bei Darkshadow faslch ist, aber dafür müsstest du schon 1-2 Sätze aufmerksam lesen.

    Wenn du damit das mit dem fachlich unsinnigen Cast meinst, dann ist es sehrwohl richtig, dass dieser unnötig ist, allerdings ist er nicht falsch. Denn falsch ist, was der Compiler nicht oder nicht ohne Warnung übersetzt.
    Oder hast du etwas anderes gemeint??

    int *p; 
    p = malloc(sizeof(short)); 
    p = 2577;
    

    Und inwiefern ist das hier, wenn ich noch auf die Variable p zugreife, kein undefiniertes Verhalten? Ich weiß doch nicht, was in der Adresse steht?!?


  • Mod

    Ich mache es wie Wutz und gebe es auf mit dir. Meine Geduld hast du schon zwei Seiten reichlich strapaziert, jetzt reicht's mir.



  • Vielen Dank!! 🙂 Hab eure Antworten schon lange satt.

    Ich appelliere an freundlichere Zeitgenossen, die auch einem Programmieranfänger und C-Neuling helfen, ein dickes Brett vorm Kopf zu durchbohren 😃 .


Anmelden zum Antworten