Char *



  • Servus mwoidt !

    Beim ersten Fall ist es eh klar.
    Bei der Deklaration des int Zeigers mit int *a,ist zwar
    der Zeiger deklariert,zeigt aber irgendwo ins Nirvana oder besser
    auf jede beliebige Speicherstelle innerhalb des Heaps und nicht etwa auf NULL
    wie Du geschrieben hast(außer es will der Zufall so : )).
    Wenn Du einen Zeiger bei der Deklaration mit NULL initialisierst,also
    int *a = NULL; dann ist der Zeiger in diesem Fall entschärft.
    Würdest Du anschließend dem Zeiger mit *a = 1234; einen Wert zuweisen,wäre das völlig legal,weil Du mit NULL keine gültige oder existierende Speicherstelle überschreiben kannst.

    Im zweiten Fall müßte es schon an der Kompilierung happern,da &123456789 keine Adresse für den Compiler darstellt.Das & Zeichen ist für eine Konstante unzulässig.In diesem Fall müßtest Du das ganze Casten.
    int *i; i = (int*) 123456789; Das wäre eine legale Adresse,die Frage ist nur,wohin der Zeiger tatsächlich zeigt !?

    Um eine legale Speicherstelle zu manipulieren,muß der Zeiger natürlich erstmal auch eine gültige und sichere Adresse erhalten .

    Im dritten Beispiel ist das der Fall.

    char *A;
    A = "HUHU";

    Der Zeiger A erhält die Adresse eines konstanten(!!)Strings,dieser String ("HUHU") stellt,da es ein Array ist,die Adresse des ersten Zeichen,also 'H' dar. Da dem Zeiger aber die Adresse eines konstanten Strings("HUHU") übergeben wurde ist zwar eine Zuweisung aber keine Manipulation des Strings möglich !

    Hoffe konnte Dir helfen : )

    Mfg Giga



  • Original erstellt von Gigabyte:
    **...
    Wenn Du einen Zeiger bei der Deklaration mit NULL initialisierst,also
    int *a = NULL; dann ist der Zeiger in diesem Fall entschärft.
    Würdest Du anschließend dem Zeiger mit *a = 1234; einen Wert zuweisen,wäre das völlig legal,weil Du mit NULL keine gültige oder existierende Speicherstelle überschreiben kannst....
    **

    einen NULL-zeiger zu dereferenzieren ist keine gute idee.
    das verhalten ist undefiniert. du hast ein aehnliches problem,
    das beim schreiben auf irgendeine speicherstelle auftritt.



  • Jo is klar. Sowas in der Art hätte ich auch vermutet

    Vielen dank für eure viele Mühe



  • Original erstellt von Gigabyte:
    Das & Zeichen ist für eine Konstante unzulässig.

    einspruch!

    In diesem Fall müßtest Du das ganze Casten.
    int *i; i = (int*) 123456789;

    der zeiger zeigt dann auf die adresse 123456789 und nicht auf die adresse von 123456789 - das ist ein unterschied zu dem, was der Fragesteller original machen wollte.



  • Zur Dereferenzierung der Zeiger mit NULL ->

    Blackout meinerseits....

    Stimmt,die NULL Adresse ist eine offizielle Adresse wie jede andere auch,nur diese Adresse verwendet man standardmäßig in C\C++ zum Überprüfen einer zBsp.erfolgreichen Zuweisung einer Adresse(die dann eben nicht 0 ist)durch eine Funktion an den Zeiger,nach der Dereferenzierung mit NULL.
    Wollte hier nicht Verwirrung stiften ...sorry nochmal : )

    Original erstellt von Shade Of Mine:

    der zeiger zeigt dann auf die adresse 123456789 und nicht auf die adresse von 123456789 - das ist ein unterschied zu dem, was der Fragesteller original machen wollte.

    Ist natürlich klar :)Habe nichts anderes behauptet,deswegen habe ich ja auch geschrieben Das wäre eine legale Adresse,die Frage ist nur,wohin der Zeiger tatsächlich zeigt !?

    Mfg Giga 😉



  • a zeigt nicht auf NULL, a zeigt in der Regel irgendwo hin, zufallsbedingt, je nachdem dorthin, was grad zufälligerweise im Speicher steht. manche Compiler NULLen den Speicher erst, aber das i.d.R. nur in den Debugversionen.



  • @gigabyte:
    const int pi = 3.14;
    const int* const pipointer = & pi;
    was ist daran unzulässig?



  • Original erstellt von mwoidt:
    **Wiso geht dashier aber?

    char *A;
    A = "HUHU";
    

    😕**

    Afaik geht das nur noch, damit nicht Millionen von C-Codes neu geschreiben werden müssen...



  • Original erstellt von MaSTaH:
    Afaik geht das nur noch, damit nicht Millionen von C-Codes neu geschreiben werden müssen...

    Jop. In C ist es erlaubt (aber afaik deprecated) in C++ nicht.



  • Jop. In C ist es erlaubt (aber afaik deprecated) in C++ nicht.

    Irrtum. In C ist es erlaubt.
    In C++ existiert extra dafür eine Konvertierung von const char* nach char*. Genau die ist aber deprecated (Annex D - D.4).


Anmelden zum Antworten