Zum Inhalt springen

Frage zu Pointervariablen (Ansi C)


Eleu

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.
Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...