deprecated conversion from string constant to ‘char*’

Dieses Thema im Forum "C/C++" wurde erstellt von trunksen, 21.03.2010.

  1. #1 trunksen, 21.03.2010
    trunksen

    trunksen Doppel-As

    Dabei seit:
    13.10.2006
    Beiträge:
    139
    Zustimmungen:
    0
    Ort:
    Österreich, Steiermark
    Hi!

    Also ich lerne gerade C++ programmieren (mit dem Buch C++ für Dummies =)

    In dem Programm geht es gerade darum, Strings mithilfe von Pointern zu manipulieren!
    Ich habe das Programm eins zu eins aus dem Buch (Stand 2005) kopiert, bekomme aber trotzdem immer eine Fehlermeldung!

    Hier einmal der Sourcecode:

    Code:
    #include <cstdio>
    
    #include <cstdlib>
    
    #include <iostream>
    
    using namespace std;
    
    int main(int nnumberofargs, char* pszargs[]) {
    	char* szstring = "Dominik";
    	cout <<"Das Array ist: " << szstring << endl;
    	cout <<"Den String als ein Array anzeigen: ";	
    	for(int i = 0; i < 7; i++)
    	{
    		cout << szstring[i];
    	}
    	cout << endl;
    	cout << "Den String mit einem Zeiger anzeigen: ";
    	char* pszstring = szstring;
    	while (*pszstring)
    	{
    		cout << * pszstring;
    		pszstring++;
    	}
    	cout << endl;
    	return 0;
    }
    		
    Wenn ich den kompiliere kommt immer folgende Fehlermeldung (wie bereits im Titel des threads):
    Code:
    pointerstring.cpp: In function ‘int main(int, char**)’:
    pointerstring.cpp:8: warning: deprecated conversion from string constant to ‘char*’
    
    Ich verwende den gcc-4.4!
    Ich habe auch schon probiert die "string" library zu inkludieren!
    Kann es sein, dass sich da seit 2005 etwas im Gnu-Compiler wesentlich verändert hat, oder ist da einfach ein Fehler im Buch?

    P.s.: Ich weiß, dass das Programm nicht viel Sinn macht, bzw. dies auch viel einfacher ginge (einfach als Array schreiben) aber es geht eben darum, zu lernen, dass man Strings auch mit Pointer manipulieren kann!

    mfg trunksen
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 marcellus, 21.03.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Nimm:

    Code:
    10c10
    < 	char *szstring = "Dominik";
    ---
    > 	char szstring[] = "Dominik";
    
    Macht im Endeffekt nichts anderes, aber er sollte nicht mehr herummeckern
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Das ist ein ziemlich erheblicher Unterschied. Im ersten Fall ist szstring ein Zeiger. Da er nicht konstant ist, kann er waehrend des Programmverlaufs auf viele verschiedene Bereiche im Speicher zeigen. Sobald Du ihn umsetzt, steht "Dominik" immer noch da, wo es beim Programmstart stand, doch Du hast keine Referenz mehr darauf und somit einen verwaisten Speicherbereich.

    Im zweiten Fall ist szstring ein array und zeigt immer auf denselben Bereich im Speicher. Du kannst diesen Speicherbereich manipulieren, z.B. aus "Dominik" einen "Fred" machen, doch szstring zeigt immer auf denselben bereich.

    Die erste Version kann Ursache fuer schicke Segmentation Faults sein, wuerde ich mal behaupten.
     
  5. #4 trunksen, 22.03.2010
    trunksen

    trunksen Doppel-As

    Dabei seit:
    13.10.2006
    Beiträge:
    139
    Zustimmungen:
    0
    Ort:
    Österreich, Steiermark
    Ok, so funktioniert es! (Also wenn man es als Array schreibt)

    Aber ist es jetzt ein Fehler im Buch?

    Genau darum geht es ja in dieser Übung!
    Kann man es so nicht machen?

    mfg trunksen
     
  6. #5 marcellus, 22.03.2010
    marcellus

    marcellus Kaiser

    Dabei seit:
    09.05.2007
    Beiträge:
    1.392
    Zustimmungen:
    0
    Ansich schon, es funktioniert auch, aber wie rikola schon vollkommen richtig gesagt hat ist es eine häufige Fehlerquelle und sollte lieber vermieden werden, wenn es irgendwie anders geht.

    Es hat einen Grund, dass du dieses Warning bekommst.
     
  7. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Wenn Du szstring gerne als Zeiger haben moechtest, kannst Du solchen Code benutzen:
    Code:
    #include <string.h>
    #include <stdlib.h>
    
    int main() {
        char* ptr;
        ptr = strdup("Guten Abend!");
        free(ptr);
    
        return 0;
    }
    
    strdup legt dann den Speicher automatisch an, den Du mit free wieder frei gibst. Das ist zumindest sauberer programmiert.
     
  8. #7 Blender3D, 23.03.2010
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    Du könntest auch den Speicher mit malloc(); reservieren. Das wäre auch sauber. Hätte zudem den Vorteil, dass man über den Zeiger auf den Speicherinhalt zugreifen kann und darin rumschreiben kann.

    Grüße, Blender3D
     
  9. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    [mini-klugscheiss-modus]
    Wenn ich 'man strdup' richtig verstehe, macht es genau das und hat den Vorteil, dass man die Zeichen im String nicht selber zaehlen muss ;-)
    [/mini-klugscheiss-modus]
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. Pik-9

    Pik-9 Tripel-As

    Dabei seit:
    04.12.2008
    Beiträge:
    168
    Zustimmungen:
    0
    OK, das war jetzt ein Beispiel aus dem Buch, aber ein Tipp für die Zukunft:
    wenn du std::string benutzt wird alles erheblich viel einfacher und unkomplizierter!

    Code:
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main (int argc, char *argv[])
    {
      string S1 = "Hallo ";
      string S2 = "Welt";
    
      string S3 = S1 + S2;
    
      cout << S3.c_str () << endl;
    }
    
     
  12. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    @Pik-9: Gute Bemerkung! Vielleicht sollte ein modernes C++-Buch ohnehin ohne Zeiger auskommen.
     
Thema:

deprecated conversion from string constant to ‘char*’