char und char*

nero4444

Grünschnabel
Hi;
ich habe ein Verständnis Problem:

Wenn ich

char test [20] = „Hallo“;
schreibe, habe ich ein Feld von 20 Zeichen, also ein String in dem
Hallo/0 steht und im Rest des Feldes steht irgendetwas.

Soweit gut, aber wenn ich schreibe
Char *test= „Hallo“;
habe ich doch ein Pointer auf ein char.
Und = „Hallo „ schreibt mir H auf den Speicherplatz allo/0 auf die nachfolgenden Speicherplätze . Ist das Richtig?

Aber wo steht das denn? Muss ich nicht noch mit new Speicher zuweisen?

Es funktioniert aber ohne.

Ich wollte es so mache:

in main
open("test");

die Funktion open.


Open(char* szFileName)
.
.
sprintf (m_szFileName, "%s", szFileName );
.
.

Geht aber nicht!
Also, wie ist das mit dem Char *test?


Danke im Voraus

Nero4444
 
Das sollte aber gehen. Welcher Typ = m_szFileName? Wenn m_szFileName auch char* ist, dann geht das wirklich nicht.

Bei char* = "Hallo" belegt der Compiler bzw. Linker die Zeichenfolge "Hallo\0" selbst und setzt den char-Pointer auf das erste Zeichen. Deshalb musst du da nicht selbst rum-new-en. Dafür kannst/sollst/darfst du aber dann diesen char-Pointer nicht als Ziel für etwas nehmen. Das geht gut, wenn das Reingeschriebene nicht länger ist, ist aber dann eher Glückssache. Sollte man auf keinen Fall tun.

Übrigens, kümmer dich gar nicht um die char's, benutzt lieber std::strings. Bei char* ist meistens irgendwo Ärger im Verzug.
 
char test [20] = „Hallo“;
Hier legst du ein Array an, der die länge von 20 Chars hat und mit Hallo\0 gefüllt ist. Die anderen 14 Werte sind unbestimmt. Wenn man nur test hinschreibt hat man ein Char Zeiger der auf den ersten dieser 20 Werte zeigt. Die 20 Werte darf man manipuliere wie man will.

char *test= „Hallo“;
Hier legst du nur ein Zeiger an der auf einen String zeigt, der String liegt dabei irgendwo im Speicher und sollte NICHT verändert werden, da ansonsten was unvorhersehbares passieren kann (Stack überschreibung, geschützter Speicherbereich etc.)

Noch was:
char *test;
test = new char[20];

Dann zeigt test (wenn ungleich NULL) auf ein speicher der auf dem Heap allociert wurde und auch beliebig verändert wertden kann, Um diesen Speicher wieder freizugeben muss man:
delete [] test;
schreiben. Beachte jedoch dass der Zeiger test nicht verändert werden darf mit test++ oder dergleichen wenn du den speicher wieder freigeben willst (d.h. bei delete muss der Zeiger verwendet werden der bei new erhalten wurde)
 
Zuletzt bearbeitet:
Hy!

Eines hab ich entdeckt:
Ich denke du möchtest ein File mit dem Namen "Hallo" öffnen, für den Fall müsstest du open( test); schreiben, also ohne die Anführungszeichen. Sollte aber trotzdem kein Syntaxfehler sein das so zu machen.
Als zweites meint die MSDN das Open nicht
Code:
Open(char* szFileName)

sondern:

int _open(
   const char *filename,
   int oflag [,
   int pmode] 
);

solltest du also nicht den BC verwenden, und das dort anders sein hättest du den "oflag" vergessen - den Öffnungsmodus. Ausserdem denke ich, musst den Rückgabewert in eine Variable speichern, um ihn für spätere Fileoperationen noch verwenden zu können.

Wegen der sprintf() fällt mir jetzt auch nichts ein, poste vielleicht mal die Fehlermeldung die du Compilieren bekommst.

mfg
uhu01
 
Zuletzt bearbeitet:
Danke hat mir alles weitergeholfen.

Ich muss fürs Studium eine Klasse für File-Handling schreiben.

Mein Prof. mag aber gerne C und ich muss char* und fopen , fclose usw. benutzen.



Das mit dem char * test =“Hallo“ habe ich in einem Buch gelesen.

Schreib ich da mit einem „wilden“ Zeiger auf nicht zugewiesenem Speicher?

Open(char* szFileName) ist eine Methode meiner Klasse die eine Datei mit dem Namen von szFileName öffnet und

Char *m_szFileName ist war eine Member-Variable meiner Klasse die den Namen in der Klasse speichert.

Ich habe aber mein Konzept neu überarbeitet.

Ich glaube ich hab es jetzt verstanden.


Danke noch mal.
 
Das mit dem char * test =“Hallo“ habe ich in einem Buch gelesen.

Schreib ich da mit einem „wilden“ Zeiger auf nicht zugewiesenem Speicher?
Nein, solange du den Pointer selbst nicht veränderst. Du kannst davon lesen und den Pointer an andere Routinen übergeben, die auch davon lesen. Nur schreiben solltest du an die Stelle nicht.
 
Zurück