Funktion char *fgets(char *s, int size, FILE *stream);
-
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.
-
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?
-
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?!?
-
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
.
-
Es war/ist durchaus üblich bei Memory-mapped-Devices einem Zeiger direkt einen Wert zuzuweisen. (Unter Dos z.B beim Speicher der Grafikkarten).
Dass du nicht weißt was an der Adresse 2577 steht, ist doch dein Problem.
Jedenfalls nicht das vom Compiler. Der versucht aus deinen Angaben etwas sinnvolles zu machen.
-
qwert_zuiopü schrieb:
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
.
Wer nicht dreist, unbelehrbar und offenkundig fälschlicherweise besserwisserisch auftritt, wird hier auch freundlich aufgenommen.
Wer dagegen zumindest diese drei Eigenschaften für sich beansprucht, sollte seine weitergehenden Kuschelbedürfnisse woanders befriedigen.Die Antworten waren von Anfang an brauchbar und gut gemeint. Wenn Du für Kritik nicht aufnahmefähig bist, solltest Du Dir das mit dem Programmieren "Lernen" nochmal überlegen, denn ohne fremde Hilfe scheinst Du nicht weit zu kommen und fremde Hilfe erfordert immer ein gewises Maß an Kritikfähigkeit.
Du hast hier im Forum die Möglichkeit, kostenlos und unverbindlich Rat und Hilfe von ziemlich brillianten Entwicklern mit unglaublicher Erfahrung zu bekommen. Dafür gibt es einerseits Spielregeln und andererseits eben die Grundvoraussetzung der Kritikfähigkeit.
-
unbelehrbar
Tut mir leid, aber ich gebe mein Bestes. Wieso sollten nicht auch dumme Menschen (zu denen ich zweifelsohne gehöre, das bestreite ich nicht) Hilfe erhalten dürfen und dabei vielleicht die ein oder andere Erklärung mehr benötigen??
"dreist" würde ich jetzt bestreiten, wenn mir die Streiterei nicht langsam auf den Keks gehen würde..
-
qwert_zuiopü schrieb:
unbelehrbar
Tut mir leid, aber ich gebe mein Bestes. Wieso sollten nicht auch dumme Menschen (zu denen ich zweifelsohne gehöre, das bestreite ich nicht) Hilfe erhalten dürfen und dabei vielleicht die ein oder andere Erklärung mehr benötigen??
Wenn man "die eine oder die andere Erklaerung mehr benoetigt", sollte man
vielleicht ein bisschen hoeflicher auftreten und zumindest versuchen, die
Erklaerungen der Profis hier zu verstehen.
-
Wer zuerst äußerst unfreundlich aufgetreten ist, kann man leicht an den Posts der ersten Seite erkennen..
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.Genau dieser Beitrag war es, auf den ich vielleicht etwas überreagiert habe. Recht freundlich ist er aber auch wirklich nicht..
-
So, dann lasst uns das Hickhack beenden und wieder zu C kommen.
Da sich das Thema eh schon seit längerem vom Titel abhebt mach ich mal noch keinen neuen Thread auf.
int size = 10; char **array = malloc(size * sizeof(char *)); array[0] = malloc(10*sizeof(char *)); array[1] = malloc(10*sizeof(char *)); array[0] = "Test"; array[1] = "Zeichen"; free(&array[0]); free(&array[1]); printf("%s\n%s",array[0],array[1]);
Also, meine Idee: Ich erzeuge ein Array aus Zeigern und lege in jedem Element einen Zeiger auf einen String an. Da ich diesen mit malloc angefordert habe, sollte ich den doch mit free wieder freigeben können. Warum funktioniert hier das erste free, das zweite jedoch nicht?
-
1. Forderst du nirgends Speicher für einen String (Arroa of char) an.
2. Überschreibst du mit Zeile 7 und 8 den Zeiger auf den Speicher aus Zeile 4 und 5.Das
free(&array[0]);
ist gelichfree(array);
. Den Speicher hast du auch angefordert (Zeile 3)Was ist mit dem Speicher aus Zeile 4 und 5 ?
Und mit einem printf kannst du nicht feststellen, ob der Speicher wieder frei ist.
Die Daten werden nicht überschrieben.Den Wert eines Zeigers kanns tdu dir bei printf mit %p anzeigen lassen.
printf("array: %p array[0]: %p array[0]: %p\n", array, array[0], array[1]);
-
Ok. Dann sollte der verbesserte folgende Code so aussehen:
char **array = malloc(10*sizeof(char*)); for(int i=0;i<10;i++) array[i] = malloc(20*sizeof(char)); array[3] = "String"; free(array[3]); //Fehler
Nun habe ich doch für array[3] Speicher angefordert, richtig? Warum kann ich den dann nicht freigeben?
-
qwert_zuiopü schrieb:
Nun habe ich doch für array[3] Speicher angefordert, richtig? Warum kann ich den dann nicht freigeben?
Weil array[3] beim free nicht mehr auf das zeigt, was angefordert wurde, sondern auf das String-Literal "String". Vielleicht wolltest du davor ja nicht den Zeiger ändern, sondern
strcpy
benutzen.
-
sondern strcpy benutzen
Vielen vielen Dank. Mein Brett ist endlich durchbohrt :).