deprecated conversion from string constant to ‘char*’

trunksen

trunksen

Doppel-As
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
 
Nimm:

Code:
10c10
< 	char *szstring = "Dominik";
---
> 	char szstring[] = "Dominik";

Macht im Endeffekt nichts anderes, aber er sollte nicht mehr herummeckern
 
Nimm:

Code:
10c10
< 	char *szstring = "Dominik";
---
> 	char szstring[] = "Dominik";

Macht im Endeffekt nichts anderes, aber er sollte nicht mehr herummeckern

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.
 
Ok, so funktioniert es! (Also wenn man es als Array schreibt)

Aber ist es jetzt ein Fehler im Buch?

Im ersten Fall ist szstring ein Zeiger
Genau darum geht es ja in dieser Übung!
Kann man es so nicht machen?

mfg trunksen
 
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.
 
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.
 
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
 
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

[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]
 
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;
}
 
@Pik-9: Gute Bemerkung! Vielleicht sollte ein modernes C++-Buch ohnehin ohne Zeiger auskommen.
 

Ähnliche Themen

String auf Konsole ausgeben

Problem mit Texteingabe

Schwierigkeiten beim compillieren

übungsprogramm geht nicht!! veraltete Konvertierung von Zeichenkettenkonstante in »c

g++ kompilieren schlägt fehl

Zurück
Oben