unterschied zwischen char* x="bla" und char x[]="bla"



  • .filmor schrieb:

    (1) solltest du daher auf keinen Fall verändern (ich bin mir nicht sicher, warum das überhaupt erlaubt ist, vielleicht weil altes C kein const kennt?).

    Ne das ist schon c++. Hab oben noch reineditiert das es sich hierbei um eine Übungsaufgabe aus einem Buch handelt (C++, UML und Design Patterns, Addison-Wesley). Vorgabe war das 2 Zeichenketten (wie bei (1)) mit echtem Call-by-Reference vertasucht werden.



  • mit char *p = "foobar" erzeugst du einen pointer, der auf einen const "string" zeigt. der darf nicht verändert werden, weshalb dir dein programm um die ohren fliegt, wenn du es versuchst.



  • Dann geht das wahrscheinlich wirklich nur in C und es ist eine kleine Falle in der Übungsaufgabe.



  • Chris++ schrieb:

    Dann geht das wahrscheinlich wirklich nur in C und es ist eine kleine Falle in der Übungsaufgabe.

    Nein, auch in C geht das nicht.



  • der compiler kann beim übersetzen nicht feststellen, dass da bockmist fabriziert wird 😉 die signatur der funktion ist mit dem aufruf vereinbar, weshalb es durchgeht. aber beim ausführen knallts dann.



  • Nicht, dass das wer falsch versteht (auch wenn es dafür höchstvermutlich schon zu spät ist ;)), ich meinte tatsächlich fragend, warum Stringliterale (die ja const char[n] laut Standard sind) sich mit einem einfachen char* bezeigen lassen und hatte das wiederum fragend auf früheres C zurückgeführt, welches noch kein const hatte. Gibt's auf diese Fragen Antworten?



  • .filmor schrieb:

    Gibt's auf diese Fragen Antworten?

    In der Tat gab es in C im K&R-Stil das Schlüsselwort const nicht (ich würde das gerne durch einen Standard belegen, jedoch bin ich mir nichtmal sicher, ob K&R ein Standard war). Den Rest kann ich nur vermuten, nämlich dass genau aus Kompatiblitätsgründen Stringliterale heute noch char* sein können.

    Im C++-Standard steht in 2.13.4.1, dass Stringliterale den Typ "Array von const char" haben, und ich finde gerade auch keine Ausnahme für die Konvertierung nach non-const. Andererseits hat nichtmal der Comeau-Compiler etwas dagegen, daher gibt es hier auch noch Klärungsbedarf 😉



  • Es tritt faszinierenderweise nur bei Stringliteralen auf. Versucht man das gleiche mit einem normalen const char-Array gibt's einen Compilerfehler.


  • Mod

    ISO/IEC 14882:2003 schrieb:

    4.2 Array-to-pointer conversion [conv.array]
    ...
    2 A string literal (2.13.4) that is not a wide string literal can be converted to an rvalue of type “pointer to char”; a wide string literal can be converted to an rvalue of type “pointer to wchar_t”. In either case, the result is a pointer to the first element of the array. This conversion is considered only when there is an explicit appropriate pointer target type, and not when there is a general need to convert from an lvalue to an rvalue. [Note: this conversion is deprecated. See Annex D. ] For the purpose of ranking in overload resolution (13.3.3.1.1), this conversion is considered an array-to-pointer conversion followed by a qualification conversion (4.4). [Example: "abc" is converted to “pointer to const char” as an array-to-pointer conversion, and then to “pointer to char” as a qualification conversion. ]



  • Danke.


Anmelden zum Antworten