1

Ich verwende Malloc, um ein Array von Zeigern zu erstellen. Wie auch immer, ich erhalte den Valgrind-bedingten Sprung oder die Bewegung hängt von nicht initialisierten Werten ab, wenn ich versuche, auf etwas in einem der Indizes im Array zu verweisen. In meinem Code wird manchmal etwas im Index [] gespeichert sein und manchmal nicht. Zum Beispiel könnte ein Zeiger auf den Wert 1, 4, 6 .. aber nicht in einem der anderen gespeichert sein. Mein Ziel ist es, dies ohne Valgrind-Fehler feststellen zu können!Malloc Array, bedingter Sprung bei nicht initialisierten Werten

typedef struct{ 
    char* symbol; 
    void* datapointer; 
    void* nextstruct; 
}Entry; 
void main(){ 
int sizeHint = 10000; //size of array 
Entry** arrayOfPointers = malloc(sizeHint * sizeof(Entry*)); 

//For the sake of keeping this simple, say I stored something 
//in a bunch of indexes in the array but NOT at 5 

if(arrayOfPointers[5] != NULL){ 
    //this is where my error comes, as it reads 
    //conditional jump or move depends on uninitilised value 
    //my goal is to be able to determine if something is stored at an index, and 
    //do something if its not stored 
} 

} 
+0

Sie sollten stattdessen 'calloc()' verwenden: es führt die Multiplikation für Sie aus, überprüft auf Überlauf und initialisiert den Speicher auf Null. –

+0

@ JonathonReinhart: Der aktuelle C-Standard schreibt nicht vor, dass ein Bitmuster aller '0' eine Zeigervariable gleich dem Nullzeiger machen würde: http://stackoverflow.com/questions/42471057/malloc-array-conditional -jump-on-uninitialized-values ​​/ 42471123 # comment72082868_42471123 – alk

Antwort

2

mein Ziel ist in der Lage sein, wenn zu bestimmen, was bei einem Index gespeichert ist

Nach Zuteilung der Zeiger-Array es auf alle NULL s eingestellt, bevor es mit:

for (size_t i = 0; i < sizeHint; ++i) 
{ 
    arrayOfPointers[i] = NULL; 
} 

tut dies nicht für Sie.

Vom C11 Standard (Entwurf) 7.22.3.4/2:

Die malloc Funktion ordnet für einen Objektraum, deren Größe von Größe angegeben ist und , dessen Wert unbestimmt.

+1

Besser noch, benutz ''calloc()'. –

+1

@ JonathonReinhart: Aus der Perspektive des Standards ergibt das "0" der Zeigerwerte nicht notwendigerweise, dass sie den Nullzeigerwerten gleich sind. – alk

+1

@JonathonReinhart: 7.22.3.2: "*** Die Calloc-Funktion ** [...] Der Space wird auf alle Bits Null initialisiert. 296) [...] 296): Beachten Sie, dass dies nicht dasselbe wie sein muss die Darstellung eines [...] Nullzeigers Konstante. * " – alk

0

Nach der Zuweisung über malloc der Speicher wird nicht automatisch zu NULL (oder etwas anderes) initialisiert werden. Es kann immer noch alles enthalten, weshalb Valgrind Sie vor dem Vergleich warnt.

Um die gesamte Zuteilung auf 0 initialisiert (die als NULL von mindestens GCC behandelt wird, clang und MSVC) Sie verwenden können:

memset(arrayOfPointers, 0, sizeHint * sizeof(Entry*)); 

Die Memset Funktion durch die Datei string.h Header versehen ist.

+0

* "Jetzt können Sie sicher sein, dass alle Elemente NULL sind *" können Sie leider nicht. Bitte lesen Sie [diesen Kommentar] (http://stackoverflow.com/questions/42471057/malloc-array-conditional-jump-on-uninitialized-values/42471123#comment72082868_42471123). – alk

+0

Danke, wusste das nicht. Die Antwort wurde leicht geändert. – Moritz

+0

Obwohl dies nicht mehr explizit falsch ist, macht der Begriff "* in der Regel *" ohne weitere Erklärung dessen, was dies bedeuten könnte, nicht die Antwort eine gute Antwort ... – alk

Verwandte Themen