Eleu Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 Hallo, ich hätte noch mal zwei Fragen. Das nachfolgende Script erzeugt einen Textfile und schreibt einen Text hinein. { 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); } Frage: Warum darf ich der Pointervariablen a den String "Hallo Welt" übergeben, obwohl kein Speicher für die Pointervariable reserviert wurde ? 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. { 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); } Damit es funktioniert, müsste ich wieder in eine Variable, für die Speicher reserviert wurde, zwischenspeichern: { 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,; } fclose(datei); } [/code] 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
fisianer2009 Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 Ich verstehe es so, dass a auf die Speicherstelle zeigt, in der der String "Hallo Welt" steht.Der "String" ist ein sogenanntes Literal. Der Speicher für Stringliterale wird automatisch bereitgestellt, darum brauchst du dich nicht zu kümmern. Aber warum kann man nicht direkt mit strcat(a,"12345"); einen String an a anhängen.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. Warum zeigt a in dem Fall nicht auf die Speicherstelle, an der der String angehangen werden soll ? Wenn du willst, dass a auf einen Speicherbereich zeigt, in dem du Anhängen darfst, dann darf a eben nicht auf ein Literal zeigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Eleu Geschrieben 30. Januar 2012 Autor Teilen Geschrieben 30. Januar 2012 Hallo und Danke, Wenn du willst, dass a auf einen Speicherbereich zeigt, in dem du Anhängen darfst, dann darf a eben nicht auf ein Literal zeigen. Wie ist das gemeint ? Soll ich den Pointer dann so deklarieren? char *a[255]; Wenn ich das aber mache, meckert der compiler beim Übersetzen. (Left Operand must be an I-Value) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Januar 2012 Teilen Geschrieben 30. Januar 2012 Wie ist das gemeint ? Soll ich den Pointer dann so deklarieren?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. char *a[255];Das ist ein Array von Zeigern, das ist Unsinn. (Left Operand must be an I-Value) Du kannst ein char-Array mit einem Stringliteral initialisieren: char a[255] = "Hallo Welt"; Aber du kannst einem Array nichts zuweisen, du musst also mit strcpy/strcat arbeiten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.