I\'m trying to create my own swap function but I have troubles.
Why I\'m getting \" dereferencing void pointer \" ?
void ft_swap(void *a, void *b, size
It's not allowed to dereference void pointer. You need to cast it to another pointer type:
cur_a = (unsigned char *)a;
Similarly, you can't assign anything to *a
. Right code is:
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;
}
}
You want to cast the (abstract) void*
pointer to a pointer to unsigned char
so code:
cur_a = (unsigned char *)a + i;
Your code was understood as cur_a = (unsigned char *)(*a) + i;
which wrongly dereferences a void*
abstract pointer.
BTW, your *a = cur_b;
does not make sense neither. Perhaps you want
((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.
In the lines:
*a = cur_b;
*b = cur_a;
you are dereferencing void*
too.
Here's my suggestion to fix the function:
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;
}
}
Because you are dereferencing void pointers:
void ft_swap(void *a, void *b, size_t nbytes)
{
...
cur_a = (unsigned char *)*a + i; // here
cur_b = (unsigned char *)*b + i; // here
Doing *a
means you first dereference a
, and then you cast the result (whatever that is, dereferencing void*
doesn't make much sense) to a pointer to unsigned char
. Doing
cur_a = *((unsigned char *)a) + i;
makes more sense.
Look your statement
cur_a = (unsigned char *)*a + i; // here
if a
is a pointer to void (void *a
) then *a = void
. Then the subexpression (unsigned char *)*a
means that you want to cast void
to a pointer to char.
But void
means 'inexistent type' in C, from this the error.
You may ask why a pointer to void make sense instead, it makes sense because it is an address, that is a valid data type in C. You can use the address for all the operations that doesn't involve the pointed type. I.e. assigning the address to a pointer to whichever type of data, and the reverse, is legal. It's is illegal an expression like a[2]
where the subscript operator []
need the size of the data pointed to compute the address where to retrieve the value. Of course void
, as bogus type, have no size (same way as it miss many other properties).
Said that I would conclude that it was just an error in your code, and that what you really want to do is:
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++;
}
}