Ist es möglich, einen void-Zeiger direkt zu schreiben, ohne einen Fehler zu verursachen? Unten ist ein kleiner Codeschnipsel, den ich aus dem Code here (Beispiel unter Pthread Joining Abschnitt der Seite) extrahiert habe.Typ-casting void * zu lang
{
void *status;
long t;
rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);
rc = pthread_join(thread[t], &status);
printf("Main: completed join with thread %ld having a status of %ld\n",t,(long)status);
}
Wie this manual page sagt, dass pthread_join() kopiert die Exit-Status des Ziel-Thread (dh, dass der Wert der Ziel-Thread zu pthread_exit geliefert()) in die Stelle, auf die durch * RETVAL (* status in dieser Fall). Aber in dem Programm, das ich erwähnt habe, zeigt der Status keinen Ort. Wie kommt es dann, dass das Programm noch funktioniert?
Und zweitens, so weit mein Wissen betrifft, kann der Status keinen langen Wert halten, und dann gibt uns der Typisierungsstatus einen Wert, der lang ist und keine Adresse?
Duplizieren von http: // Stackoverflow .com/questions/12949383/converting-primitive-Datentyp-in-void-Zeiger-Typ? –
@MartinR: Wie [this] (http://man7.org/linux/man-pages/man3/pthread_join.3.html) sagt, dass ** pthread_join() den Exit-Status des Ziel-Threads kopiert (dh der Wert, den der Zielthread an pthread_exit (3)) an den Ort liefert, auf den * retval ** zeigt.Aber in dem Programm, das ich erwähnt habe, verweist _status_ nicht auf irgendeinen Ort. Wie funktioniert das Programm? –
Es funktioniert zufällig. Der Variablenstatus wird nicht initialisiert, so dass er in alle Statuspunkte schreibt. Zufällig kann es irgendwo legal sein. Wenn es irgendwo illegal ist, werden Sie einen Absturz bekommen. – cup