Pointer
-
Hi,
ich wollte ein Beispiel nach dem "Buch C++ Primer" folgenden Code ausführen:const char *cp1 = "A string example";Leider bekomme ich mit Xcode (GCC 4.x) folgende Fehlermeldung:
error: invalid initializer
Weiss jemand weiter?!
THX im Voraus!
L. G.
Steffo
-
Die Codezeile und der Fehler haben nichts mit einander zu tun.
-
Stimmt, bei mir lässt es sich problemlos kompilieren. (Hab den Borland C++ 5.5) Bist du dir sicher, dass der Fehler des Compilers etwas mit dieser Zeile zu tun hat? Wenn der Quelltext nicht zu lang ist, könntest du ihn ja mal ganz Posten. Eventuell könntest du auch mal versuchen, den Code mit einem anderen Compiler zu kompilieren.
MfG, Jochen
-
Es ist zwar ungewoehnlich, den Fehler zur Loesung zu posten, aber vielleicht
hast du irgendwo in deinem Code zum Beispiel sowas:// dies wuerde zu error: invalid initializer fuehren wegen [] const char *cp1[] = "A string example";und hast hier die falsche Zeile erwischt

Deine gepostete Codezeile ist richtig.
-
Danke, für eure Antworten!
Ich bekomme sowohl bei cp1, als auch bei cp2 den genannten Fehler:
#include <iostream> #include<string> using std::string; using std::cout; using std::cin; int main (int argc, char * const argv[]) { int iBla; const char *cp1[] = "A string example"; //16 Zeichen lang const char *cp2[] = "A different string"; //18 Zeichen lang8 char largeStr[16 + 18 + 2]; strcopy(largeStr, cp1); cin >> iBla; return 0; }L. G.
Steffo
-
const char *cp1 = "A string example"; //16 Zeichen lang char *cp2 = "A different string"; //18 Zeichen lang8du hattest es doch richtig

//Edit: In Zeile 15 fehlt ein Semikolon am Ende
-
OK, habe den Code nun 2 Posts weiter oben editiert, aber der Fehler bleibt bei beiden Pointern bestehen.

L. G.
Steffo
-
Steffo schrieb:
OK, habe den Code nun 2 Posts weiter oben editiert, aber der Fehler bleibt bei beiden Pointern bestehen.

L. G.
SteffoDu musst die eckigen Klammern hinter
cp1undcp2weglassen.
-
Oh, stimmt! Ist ja kein Array!

THX!
L. G.
Steffo
-
Steffo schrieb:
Oh, stimmt! Ist ja kein Array!

THX!
L. G.
SteffoEin String ist ein Array. Schließlich deklarierst du mit char * einen Zeiger auf ein Array von char. Aber das führt wohl zu weit.
-
Stimmt auch nicht ganz, mit * deklarierst du einen Zeiger auf ein char. Ein Zeiger auf ein Array von char sieht so aus:
char (*p)[];.Aber das führt definitiv zu weit

-
Ich habe zu dem geposteten Beispiel im Buch noch eine Frage:
const char *cp1 = "A string example"; //16 Zeichen lang const char *cp2 = "A different string"; //18 Zeichen lang char largeStr[16 + 18 + 2]; strcpy(largeStr, cp1); strcat(largeStr, " "); //Ein Leerzeichen am Ende von largeStr einfügen strcat(largeStr, cp2); //Gibt "A string example A different string" aus. cout<< "\nlargeStr: " << largeStr;Bei
char largeStr[16 + 18 + 2];werden am Ende 2 Zeichen hinzugefügt. Eins fürs Leerzeichen und das andere? Für das abschließende Nullzeichen? Im Buch steht's nicht drin!
Ferner habe ich bei der Autovervollständigung erkannt, dass strcat(<#char * #>, <#const char * #>) beim ersten Parameter ein char * verlangt, aber ich habe largeStr nicht wirklich als Pointer deklariert und wieso muss der zweite Parameter konstant sein?!
EDIT: Ich merke gerade, dass der Code auch dann geht, wenn der zweite Parameter nicht konstant ist.
Danke wieder im Voraus!
Liebe Grüße
Steffo
-
Steffo schrieb:
Bei
char largeStr[16 + 18 + 2];werden am Ende 2 Zeichen hinzugefügt. Eins fürs Leerzeichen und das andere?
Das steht für das
'\0'(0-Terminierungs-)Zeichen, das am Ende angehangen werden muss
-
const char* ist ein Zeiger, dessen Ziel (in dem Fall ein String) nicht verändert werden kann. Dadurch das die Funktion einen const char* als Parameter übernimmt garantiert sie dir, dass sie den String nicht verändern wird, sie kann es schlicht nicht. Wenn du statt dessen einen char* übergibst wird das implizit einfach zu einem const char* konvertiert, denn Schreibschutz hinzufügen ist ungefährlich. Andersherum geht das dagegen nicht, einen const char* kann man nicht ohne weiteres in einen char* konvertieren.
-
hgjghj schrieb:
Ein String ist ein Array. Schließlich deklarierst du mit char * einen Zeiger auf ein Array von char.
Ein Zeiger vom Typ
char*ist ein Zeiger, der auf ein char-Objekt zeigen kann -- wie zB das erste Element eines char-Arrays. Es ist aber kein Zeiger auf ein Array. Ein Zeiger auf ein char-Array ist vom Typchar(*)[N], wobei N die Anzahl der Elemente des Arrays ist.#include <iostream> int main() { const char *p = "p zeigt auf das erste Zeichen"; const char (*q)[31] = &"q ist ein Zeiger auf ein Array"; std::cout << p << '\n'; std::cout << *q << '\n'; }
-
Danke, für eure Antworten, hat mir wirklich weitergeholfen!

EDIT: Ich sehe gerade, dass die Antwort im Buch auf der nächsten Seite stand.

L. G.
Steffo