Hallo,
ich hätte noch mal zwei Fragen.
Das nachfolgende Script erzeugt einen Textfile und schreibt einen Text hinein.
Frage: Warum darf ich der Pointervariablen a den String "Hallo Welt" übergeben, obwohl kein Speicher für die Pointervariable reserviert wurde ?Code:{ FILE *datei; char Datei[100]; char *a; sprintf(Datei,"C:\\Text4.txt"); datei = fopen( Datei, "a"); if (datei != NULL) { a="Hallo Welt"; fprintf (datei,a); } fclose(datei); }
Zweite Frage:
An dem Text soll mit strcat ein weiterer Text angehangen werden
Dieser Code erzeugt dabei einen Fehler, weil kein Speicher für a reserviert wurde.
Damit es funktioniert, müsste ich wieder in eine Variable, für die Speicher reserviert wurde, zwischenspeichern:Code:{ FILE *datei; char Datei[100]; char *a; sprintf(Datei,"C:\\Text4.txt"); datei = fopen( Datei, "a"); if (datei != NULL) { a="Hallo Welt"; strcat(a,"1234567"); fprintf (datei,a); } fclose(datei); }
Code:{ FILE *datei; char Datei[100]; char *a; char b[255]; sprintf(Datei,"C:\\Text4.txt"); datei = fopen( Datei, "a"); if (datei != NULL) { a="Hallo Welt"; strcpy(b,a); strcat(b,"12345"); fprintf (datei,b); } fclose(datei); }
Ich verstehe es so, dass a auf die Speicherstelle zeigt, in der der String "Hallo Welt" steht.
Aber warum kann man nicht direkt mit strcat(a,"12345"); einen String an a anhängen.
Warum zeigt a in dem Fall nicht auf die Speicherstelle, an der der String angehangen werden soll ?
Gruß
Eleu
+ Antworten
Ergebnis 1 bis 5 von 5
Frage zu Pointervariablen (Ansi C)
Diskussion über Frage zu Pointervariablen (Ansi C) in C und C++ der Kategorie Programmierung; Hallo, ich hätte noch mal zwei Fragen. Das nachfolgende Script erzeugt einen Textfile und schreibt einen Text hinein. Code: { ...
- 30.01.2012 11:55 #1
Frage zu Pointervariablen (Ansi C)
Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913
- 30.01.2012 12:17 #2Reg.-Benutzer
- Reg.-Datum
- 16.01.2009
- Beiträge
- 237
sers, ich kann dir nicht alles erklären, aber folgendes:
normalerweise hat der pointer immer nur eine adresse als wert. d.h du kannst dem pointer eine neue adresse zuweisen, aber keinen wert.
um den wert der variable zu ändern auf der der pointer zeigt. muss man das mit dem dereferenzierungsoperator machen: *
*pointer = "neuer wert".
...aber wenn ich falsch liege bitte korrigiere mich
- 30.01.2012 12:23 #3
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
Der "String" ist ein sogenanntes Literal. Der Speicher für Stringliterale wird automatisch bereitgestellt, darum brauchst du dich nicht zu kümmern.
Der Standard sagt, dass man auf den Speicher von Stringliteralen nur lesend zugreifen darf. Anhängen ist ein Schreibzugriff und damit verboten.
Der technische Grund ist, dass der Speicher für Stringliterale zwar automatisch bereitgestellt wird. Aber eben nur genau so groß, wie er sein muss. Dahinter ist einfach kein Platz zum Anhängen, da stehen bereits andere Inhalte, die dann überschrieben würden.
Auf manchem Systemen werden Stringliterale auch durchaus in Speicher abgelegt, der zur Laufzeit wirklich nur gelesen werden kann.
Wenn du willst, dass a auf einen Speicherbereich zeigt, in dem du Anhängen darfst, dann darf a eben nicht auf ein Literal zeigen."Funktioniert nicht" ist keine ausreichende Problembeschreibung.
- 30.01.2012 12:38 #4
Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913
- 30.01.2012 13:20 #5
Administrator + Moderator
C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
- Reg.-Datum
- 10.07.2001
- Ort
- Essen
- Beiträge
- 8.980
Du musst an der Deklaration von a gar nichts ändern. Du musst dafür sorgen, dass a auf einen Speicherbereich zeigt, der groß genug ist, und auf den du schreibend zugreifen kannst.
Du kannst a natürlich statt als Zeiger gleich als hinreichend großes Array deklarieren.
Das ist ein Array von Zeigern, das ist Unsinn.
Du kannst ein char-Array mit einem Stringliteral initialisieren:
Aber du kannst einem Array nichts zuweisen, du musst also mit strcpy/strcat arbeiten.Code:char a[255] = "Hallo Welt";
"Funktioniert nicht" ist keine ausreichende Problembeschreibung.
Aktive Benutzer
Aktive Benutzer
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Ähnliche Themen
-
1 Frage zum "subnetting" und 1 Frage zu AD/DNS
Von .noname im Forum Windows BetriebssystemeAntworten: 9Letzter Beitrag: 25.05.2010, 09:53 -
Frage zu TCP und UDP
Von Eleu im Forum Networking TechnologiesAntworten: 2Letzter Beitrag: 21.04.2010, 19:23 -
Frage zu relativ einfancher Frage
Von SchnittenP im Forum Prüfungsaufgaben und -lösungenAntworten: 3Letzter Beitrag: 20.02.2006, 08:53 -
JS-Frage
Von inet im Forum WebdesignAntworten: 5Letzter Beitrag: 18.05.2004, 08:36 -
[AP Winter 2003/2004] Frage zu Frage ;)
Von Saesh im Forum Prüfungsaufgaben und -lösungenAntworten: 4Letzter Beitrag: 12.04.2004, 16:44
Die häufigsten Suchbegriffe für diese Seite:
Bisher noch keine Treffer von einer Suchmaschine

LinkBack URL
About LinkBacks
Zitieren