+ 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: { ...

  1. #1
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard Frage zu Pointervariablen (Ansi C)

    Hallo,

    ich hätte noch mal zwei Fragen.
    Das nachfolgende Script erzeugt einen Textfile und schreibt einen Text hinein.

    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);
    }
    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.

    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);
    }
    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;
    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
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  2. #2
    Reg.-Benutzer
    Reg.-Datum
    16.01.2009
    Beiträge
    237

    Standard

    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

  3. #3
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Eleu Beitrag anzeigen
    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.

    Zitat Zitat von Eleu Beitrag anzeigen
    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.

    Zitat Zitat von Eleu Beitrag anzeigen
    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.
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung.

  4. #4
    Reg.-Benutzer Avatar von Eleu
    Reg.-Datum
    28.02.2009
    Beiträge
    708

    Standard

    Hallo und Danke,

    Zitat Zitat von Klotzkopp Beitrag anzeigen
    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)
    Was wahr ist, ist weder gut noch böse, sondern einfach wahr !
    Rabindranath Tagore, bengalischer "Alleskünstler" (1861 - 1941), Nobelpreis für Literatur 1913

  5. #5
    Administrator + Moderator
    C++: Compiler, IDEs, APIs / C und C++, Algorithmik, Basic, Sonstige, .NET
    Avatar von Klotzkopp
    Reg.-Datum
    10.07.2001
    Ort
    Essen
    Beiträge
    8.980

    Standard

    Zitat Zitat von Eleu Beitrag anzeigen
    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.

    Zitat Zitat von Eleu Beitrag anzeigen
    char *a[255];
    Das ist ein Array von Zeigern, das ist Unsinn.

    Zitat Zitat von Eleu Beitrag anzeigen
    (Left Operand must be an I-Value)
    Du kannst ein char-Array mit einem Stringliteral initialisieren:
    Code:
     char a[255] = "Hallo Welt";
    Aber du kannst einem Array nichts zuweisen, du musst also mit strcpy/strcat arbeiten.
    "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. 1 Frage zum "subnetting" und 1 Frage zu AD/DNS
    Von .noname im Forum Windows Betriebssysteme
    Antworten: 9
    Letzter Beitrag: 25.05.2010, 09:53
  2. Frage zu TCP und UDP
    Von Eleu im Forum Networking Technologies
    Antworten: 2
    Letzter Beitrag: 21.04.2010, 19:23
  3. Frage zu relativ einfancher Frage
    Von SchnittenP im Forum Prüfungsaufgaben und -lösungen
    Antworten: 3
    Letzter Beitrag: 20.02.2006, 08:53
  4. JS-Frage
    Von inet im Forum Webdesign
    Antworten: 5
    Letzter Beitrag: 18.05.2004, 08:36
  5. [AP Winter 2003/2004] Frage zu Frage ;)
    Von Saesh im Forum Prüfungsaufgaben und -lösungen
    Antworten: 4
    Letzter Beitrag: 12.04.2004, 16:44

Die häufigsten Suchbegriffe für diese Seite:

Bisher noch keine Treffer von einer Suchmaschine