[C++] char* Frage..

DataNaut

Cadet 2nd Year
Registriert
Nov. 2005
Beiträge
31
Hallo Forum,
da progammier ich nun mal ein paar Jährchen, und plötzlich stolpere ich über ein super simple Problem und bin mir unsicher: Funktioniert folgender Code, oder macht er etwas ganz böses im Speicher:
Code:
int _tmain(int argc, _TCHAR* argv[])
{
	char *envVar = getenv( "MY_ENVIRONMENT_VAR");
	if (envVar == NULL)
		envVar = "default_value";
	
	std::cout << envVar<< std::endl;
	system("PAUSE");
	return 0;
}
Das Programm compiliert und läuft wie erwartet. Mir macht nur die Zeile
Code:
envVar = "default_value";
Sorgen. Wie war das noch mit dem initialisieren und deklarieren? Schreibe ich mir da wild was in den Speicher, so dass es manchmal funktionier, und manchmal nicht?
Mercí im Voraus.
 
also du initialisierst doch da ganz ordentlich. du schreibst in die variable envVar den string"defaul_value" (falls die variable leer ist) rein :)

aber !

wäre dein speicher voll würde er trotzdem rein schreiben oder abschmieren oder so weil du keinen speicher reserviert hast

also antwort ja du schreibst da wild in den speicher... weil du da nen pointer benutzt :D

edit:

include "string.h" //oder soähnlich
using namespace std; // oder soähnlich

string envVar;

nimm den string datentyp der ist viel einfacher zu benutzen als ein character / pointer string

wenn es ein pointer sein muss aus irgendwelchen gründen musst du speicher allocieren mit: malloc/calloc
genaue syntax kann ich dir nicht sagen, das ist schon zulange ehr :D
 
Zuletzt bearbeitet:
Dein Code is in Ordnung.

Probleme würdest du bekommen wenn du z.b. strcpy(envVar, "default_value"); machen würdest ohne vorher Speicher zu reservieren.

Allerdings solltest du beachten, dass envVar auf ein String Literal zeigt, du solltest also nicht schreibend darauf zugreifen.
 
Besser waere den Speicherbereich auf den der char-Zeiger zeigt als const zu deklarieren.

const char *envVar = getenv(...)

Grus
 
@Aral
So weit ich gelesen habe ist das in C++ so (Quelle: http://tutorial.schornboeck.net/konstanten.htm):
const int i = 10; // Compiletime Konstante
int const k = 20; // Konstante, die zur Laufzeit angelegt wird


Demnach ist es nicht möglich mit const char* envVar = getenv(...) zuarbeiten, da einer Compiletime Konstanten zur Laufzeit ein Wert zugewiesen werden soll.

Ich denke, dass es dann char* const envVar = getenv(...) heißen müsste.

Aber in C++ bin ich nicht mehr so fit. Vielleicht weiß Raechaer mehr.
 
In C++ sollte man zum reservieren von Speicherplatz so vorgehen:
Code:
char* env;
env = new char[50];
Zum freigeben des Speicherplatzes dann
Code:
delete env;
Die Funktionen malloc() und free() sind reines C und daher für C++ nicht besonders gut geeignet
 
Boron schrieb:
@Aral
So weit ich gelesen habe ist das in C++ so (Quelle: http://tutorial.schornboeck.net/konstanten.htm):
const int i = 10; // Compiletime Konstante
int const k = 20; // Konstante, die zur Laufzeit angelegt wird


Demnach ist es nicht möglich mit const char* envVar = getenv(...) zuarbeiten, da einer Compiletime Konstanten zur Laufzeit ein Wert zugewiesen werden soll.

Ich denke, dass es dann char* const envVar = getenv(...) heißen müsste.

Auf der der obigen seite steht aber auch:
"Statt int const kann man auch const int schreiben, beides bedeutet das selbe"

Der unterschied ist bei Pointern:

Ist der Pointer selber const? Oder ist der Speicherbereich auf den er Zeigt const?

Deshalb ist
char* const envVar = getenv(...)
falsch, da das einen Konstanten Pointer deklariert. Und eine spaetere zuweisung wie

envVar = "default_value";

nichtmehr moeglich waere.

Auf den Speicherbereich sollte naetuerlich nicht geschrieben werden, deshalb das

const char* envVar = getenv(...)
 
das problem was er meint ist wahrscheinlich obs einfach ohne überprüfung in den speicher geschrieben wird und nen unhandled error gibt.

der pointer ist im prinzip unendlich groß und wenn er einfach envar da reinschreibt kann es ihm passieren das der pointer großer als der zu verfügung stehende speicher wird und alles abschmiert

wen er eine "richtige" variable benutzt kann das nicht passieren (oder eben wenn man speicher für den pointer reserviert)

edit: wenn er const benutzt kann die pointergröße nichtmehr verändert werden und er verschenkt speicher ... oder der pointer ist zuklein

also einfach mit den funktionen malloc und calloc speicher reservieren und alles ist supi :)
 
Nur um es nochmal zu sagen: der Code von DataNaut ist ohne Fehler und schreibt auch nirgends in nicht zugewiesenen Speicher, d.h. es ist nicht nötig malloc oder new zu verwenden.
 
Der Code ist rein technisch ohne Fehler. Allerdings gehört da eine dicke fette Warnung dran und dass man das niemals machen sollte.

Bei envVar = "default_value"; wird von const char[] (Datentyp von "default_value") erstmal implizit nach const char* gewandelt (C++ Standard 4.1 - array to pointer conversion). Dann wird ein const char* einem char* zugewiesen. Normalerweise ist das Entfernen eines const nur mit einem const_cast (oder einem C-Style-Cast) möglich - weil es eben extrem fragwürdig ist und man niemals ein const (leichtfertig oder nicht) entfernen sollte.
Allerdings gibt es von const char* nach char* eben genau aus Gründen der C-Kompatibilität einen impliziten Cast. Der wird auch liebevoll im Fachjargon "conversion of death" genannt. Wenn du einmal schreibend auf "default_value" zugreifst, ist das undefiniert. Das Verhalten ist von "extrem merkwürdig" bis Programmabsturz möglich. Und da der char*-Datentyp das zulässt und man ihm nicht ansehen kann, ob man dann auf den Inahlt schreibend zugreifen darf - _niemals_ machen.
 

Ähnliche Themen

N
  • Gelöst
2
Antworten
28
Aufrufe
2.072
S
Antworten
5
Aufrufe
1.218
Zurück
Oben