-1

My problem: I would like to create function that can swap any two items in array of generic type.

I have SwapG function that can swap two items of any type:

void SwapG(void * a, void * b, size_t size)
{
    void * temp = malloc(size);
    memcpy(temp, a, size);
    memcpy(a, b, size);
    memcpy(b, temp, size);
}

Here is my attempt of function that would swap two items in array of any type:

void SwapInArrayG(void ** arr, int a, int b, size_t size)
{
    void * temp = malloc(size);
    memcpy(temp, *(arr + a), size);
    memcpy(*(arr + a), *(arr + b), size);
    memcpy(*(arr + b), temp, size);
}

I'm pretty sure I messed the pointers up, still I can't find solution. I would appreciate any help :).

Erik Cupal
  • 2,735
  • 1
  • 19
  • 20

1 Answers1

1

Adding to a void * is not defined. Cast to char *.

Possibly need to need to de-reference arr, but I think OP's signature should be adjusted instead. See @user3386109

Scale the pointer calculation @EOF

Free the allocated memory too.


I'd expect passing a void * to be sufficient.

void SwapInArrayG(void * arr, int a, int b, size_t size) {
    void * temp = malloc(size);
    if (size > 0) {
      assert(temp);
      assert(a >= 0 && b >= 0);
      memcpy(temp, (char *)arr + size*a, size);
      memcpy((char *)arr + size*a, (char *)arr + size*b, size);
      memcpy((char *)arr + size*b, temp, size);
    }
    free(temp);  
}

Unclear on how OP calls this function, but the following is typical.

foo_type G[some_size];
SwapInArrayG(G, index_a, index_b, sizeof *G);

Note: depending on coding goals, using indexes of type size_t is usually preferred over type int.

Note: that assert(temp); is within if (size > 0) as allocating 0 bytes may return NULL and not be out-of-memory. OTOH, size == 0 is most unusual.

Community
  • 1
  • 1
chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256