Strings zuweisen...

Ich dachte mir halt, dass 0 und NULL unterschiedlich seien, da NULL sonst ueberfluessig waere. ;)
Naja, solang es funktioniert.

Ich hab nur grad festgestellt, dass mein IF-Konstrukt mir im ValGrind-Mem-Leak-Check einen Fehler wirft.

Der gesamte Code sieht so aus:
Code:
data=malloc(memsize+1);
if (data==NULL)
	{
		fclose(scantmpfile);
		cl_free(node);
		return EXIT_FAILURE;
	}
if (strlen(data)>0)
	{
		data[0]=(char)NULL;
	}
Grund fuer "if (strlen(data)>0)" ist, dass meine Strings nach dem allozieren nicht leer waren.
ValGrind meldet mir fuer die Zeile nun folgendes:
Conditional jump or move depends on uninitialised value(s)
Vielleicht sollte ich auf die Ueberpruefung verzichten und den String gleich pauschal terminieren.
 
moin


Sollte ja reichen das "Terminierungszeichen" ins erste Element des Strings zu packen, wenn der Speicher schon alloziert ist.


mfg
umbrasaxum
 
Ich denk das werd ich mal entsprechend aendern.
Muss ich nur noch versuchen zu verstehen was mir der Rest der Ausgabe von Valgrind sagen will. Es scheint sich dabei aber um Memory-Leaks zu handeln, und die will ich natuerlich nach Moeglichkeit noch loswerden. Aber falls ich da noch auf Probleme stosse werde ich dazu mal suchen und gegebenenfalls einen seperaten Thread oeffnen um nicht weiter den Thread eines anderen Users zu belasten. ;)
 
Hi.

Das Makro NULL bzw. ein Nullpointer wird immer gleich sein mit der konstanten Null (obwohl das Makro in C und in C++ etwas anders definiert ist).

Allerdings hat ein Nullpointer nicht unbedingt den Wert Null auf der Bitebene - der Compiler sorgt aber dafür das der Wert 0 beim Zuweisen in die richtige Repräsentation umgesetzt wird.

Man kann also NULL und 0 völlig beliebig austauschen. Allerdings bin ich der Meinung das man durch den Code ausdrücken sollte was man gemeint hat und da kommt mir eine Zeile wie diese komisch vor:
Code:
data[0] = (char)NULL;
Ganz einfach weil dort einem einzelnen Zeichen der Wert NULL (der ja für den Wert eines Nullpointers steht) zugewiesen wird. Es ist nicht falsch, da ja der Integer 0 korrekt in das Zeichen Nr. 0 umgerechnet werden kann, aber solche Zeilen machen mich immer misstrauisch ob der Autor da auch wirklich wußte was er da macht und ob es wirklich das war was er beabsichtigt hat.

Am günstigsten finde ich übrigens diese Variante:
Code:
data[0] = '\0';

Es steht direkt da was ich damit erreichen will - nämlich den String terminieren und nicht vielleicht etwa dem Pointer NULL zuweisen.

Es ist übrigens normal das valgrind da warnt wenn du strlen auf einen frisch allozierten Bereich verwendest. Es könnte ja sein, das in dem Bereich den du alloziert hast, gar keine 0 vorkommt (der String nicht terminiert ist), dann könntest du einen Segfault bekommen wenn strlen irgendwann aus dem Speicherbereich läuft.

Gruß
 
Zurück