Diese 2 Fehler kommen mit einer verknüpften Liste/Low-Level-Datei lesen/STRTok-Programm. HierC: Valgrind: Verwendung von nicht initialisierten Wert der Größe 4 UND Verwendung von nicht initialisierten Wert der Größe 4
==10982== Use of uninitialised value of size 4
==10982== at 0x40C3899: strtok (strtok.S:197)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
==10982==
==10982== Use of uninitialised value of size 4
==10982== at 0x40C38C1: strtok (strtok.S:223)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
==10982==
==10982== Conditional jump or move depends on uninitialised value(s)
==10982== at 0x40C38C4: strtok (strtok.S:224)
==10982== by 0x8048719: main (main.c:9)
==10982== Uninitialised value was created by a stack allocation
==10982== at 0x80487D2: buildList (functions.c:13)
ist die Funktion Buildlist
void buildList(int fdin, int lines)
{
char ara[4096];
int num;
double p;
read(fdin, ara, 4096);
char *nl = "\n";
char *ws = " ";
char *temp = strtok(ara, " ");
while(temp != NULL)
{
Stock *s = (Stock*)calloc(1, sizeof(Stock));
s->c.symbol = (char*)calloc(strlen(temp)+1, sizeof(char));
strcpy(s->c.symbol, temp);
temp = strtok(NULL, "\n");
s->c.name = (char*)calloc(strlen(temp)+1, sizeof(char));
strcpy(s->c.name, temp);
temp = strtok(NULL, "\n");
sscanf(temp, "%lf", &p);
temp = strtok(NULL, "\n");
s->price = p;
sscanf(temp, "%d", &num);
s->shares = num;
Node *n = (Node*)calloc(1, sizeof(Node));
n->data = s;
addOrdered(n);
temp = strtok(NULL, " ");
}
close(fdin);
}
Ich kann nicht herausfinden, warum dieser Fehler auftritt. Von dem, was ich gelesen habe, ist es, weil ich Sachen zu einem char * von strtok zuweise, ohne ihnen Speicher zuzuweisen. Aber so habe ich es in der Vergangenheit gemacht, und ich denke, es war gut.
Was ist Zeile 13 von functions.c? – aschepler
Sieht aus, als würde Valgrind die Tatsache vermissen, dass 'ara' durch' read() '" initialisiert "wird. Nur zum Grinsen, versuche etwas wie "memset (ara, 0, sizeof (ara))" direkt vor dem Lesen zu platzieren und schau, ob das die Warnung unterdrückt. Wenn dies der Fall ist, entfernen Sie es und wissen Sie, dass Sie die Warnung ignorieren können (oder erfahren Sie, wie Sie Valgrind dazu bringen, den Mund zu halten). Natürlich kann 'read()' auch fehlschlagen, in diesem Fall ist Valgrind korrekt. –
Sie geben weder die Definition von 'main' an, noch zeigen Sie die Eingabe an, die das Problem verursacht. Sie können auch keine Fehler im obigen Code überprüfen. Bitte erstellen Sie eine [SSCCE] (http://sscce.org), die uns nicht raten muss! –