C – Desviación del puntero del vacío.

Estoy tratando de crear mi propia función de intercambio pero tengo problemas.
¿Por qué me aparece el “puntero de anulación de anulación de referencia”?

void ft_swap(void *a, void *b, size_t nbytes) { unsigned char *cur_a; unsigned char *cur_b; size_t i; i = 0; while (i < nbytes) { cur_a = (unsigned char *)*a + i; // here cur_b = (unsigned char *)*b + i; // here *a = cur_b; *b = cur_a; i++; } } 

No está permitido desreferenciar el puntero del vacío. Necesitas lanzarlo a otro tipo de puntero:

 cur_a = (unsigned char *)a; 

Del mismo modo, no puede asignar nada a *a . El código correcto es:

 void ft_swap(void *a, void *b, size_t nbytes) { unsigned char *cur_a = (unsigned char *) a; unsigned char *cur_b = (unsigned char *) b; for (size_t i = 0; i < nbytes; ++i) { unsigned char tmp = cur_a[i]; cur_a[i] = cur_b[i]; cur_b[i] = tmp; } } 

Porque estás desreferenciando los punteros vacíos:

 void ft_swap(void *a, void *b, size_t nbytes) { ... cur_a = (unsigned char *)*a + i; // here cur_b = (unsigned char *)*b + i; // here 

Hacer *a significa que primero se elimina la referencia a , y luego se emite el resultado (sea lo que sea, la void* referencia void* no tiene mucho sentido) a un puntero a unsigned char . Obra

 cur_a = *((unsigned char *)a) + i; 

tiene más sentido.

Desea convertir el puntero (abstracto) void* en un puntero a un código unsigned char así que:

 cur_a = (unsigned char *)a + i; 

Su código fue entendido como cur_a = (unsigned char *)(*a) + i; que erróneamente hace referencia a un puntero abstracto void* .

Por cierto, tu *a = cur_b; No tiene sentido tampoco. Tal vez tu quieras

 ((unsigned char*)a)[i] = cur_b; 
  cur_a = (unsigned char *)*a + i; // here ^^^ that is dereferencing a void* cur_b = (unsigned char *)*b + i; // here ^^^ that is dereferencing a void* also. 

En las líneas:

  *a = cur_b; *b = cur_a; 

Usted también está anulando la void* .

Aquí está mi sugerencia para arreglar la función:

 void ft_swap(void *a, void *b, size_t nbytes) { unsigned char* cpa; unsigned char* cpb; size_t i; unsigned char c; cpa = (unsigned char *)a; cpb = (unsigned char *)b; for ( i = 0; i < nbytes; ++i ) { c = cpa[i]; cpa[i] = cpb[i]; cpb[i] = c; } } 

Mira tu statement

 cur_a = (unsigned char *)*a + i; // here 

si a es un puntero a void ( void *a ) entonces *a = void . Luego, la subexpresión (unsigned char *)*a significa que desea convertir un void en un puntero a char.

Pero void significa ‘tipo inexistente’ en C, de aquí el error. Puede preguntar por qué un puntero para anular tiene sentido en su lugar, tiene sentido porque es una dirección, es un tipo de datos válido en C. Puede usar la dirección para todas las operaciones que no involucren al tipo señalado. Es decir, asignar la dirección a un puntero a cualquier tipo de datos, y al revés, es legal. Es una expresión ilegal como a[2] donde el operador de subíndices [] necesita el tamaño de los datos apuntados para calcular la dirección donde recuperar el valor. Por supuesto, no void , como tipo falso, no tiene tamaño (de la misma manera que se pierden muchas otras propiedades).

Dijo que llegaría a la conclusión de que solo fue un error en su código y que lo que realmente quiere hacer es:

 void ft_swap(void *a, void *b, size_t nbytes) { unsigned char cur_a; //value not pointers unsigned char cur_b; size_t i; i = 0; while (i < nbytes) { cur_a = *((unsigned char *)a + i); // here cur_b = *((unsigned char *)b + i); // here *a = cur_b; *b = cur_a; i++; } }