C'è this answer in un'altra domanda sull'utilizzo di cudaMalloc((void**)&device_array, num_bytes)
, che utilizza void**
come argomento di output anziché passare un valore void*
come valore di ritorno come lo standard malloc
.Cosa c'è di sbagliato nel cast come (void **) e device_array?
Critica API di NVIDIA e afferma:
Casting, come in (void **) & device_array, non è valido C e si traduce in un comportamento indefinito .
ed è stato svitato più volte (8 fino ad ora), quindi presumo ci sia del vero in esso.
Non capisco cosa c'è di sbagliato nel casting lì.
- Che cos'è C non valido?
- In tal caso ciò comporterebbe un comportamento indefinito?
Tutto quello che so è che si compila senza preavviso e corre con il comportamento previsto per me. Ma non sono a conoscenza di C fino al livello di specifiche standard.
Stessi problemi se si esegue il comando 'int *' per 'float *'. 'void **' non è speciale allo stesso modo 'void *' is. – immibis
Quindi, non è corretto scrivere questo? 'int val = 0x4229B26C; \t printf ("il float rappresentato in memoria da 0x% X ha un valore decimale di% .03f \ n", val, * ((float *) &val)); ' – bct
Dai un'occhiata a [questo post SO] (http://stackoverflow.com/questions/15818906/does-this-pointer-casting-break-strict-aliasing-rule) – LPs