Funktion char *fgets(char *s, int size, FILE *stream);
-
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 :).