Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

converting a string to a void pointer

I’m trying to figure out how to "transform" strings (char*) to void* and viceversa.
When I execute this my output is just the first printf and ignores the second one, it doesn’t even write "after = "

PS This little program is just to understand, I know i could actually use swap(&s[0],&s[1]). I need to know how to properly cast a void pointer into an array of strings.
I’m working on a uni project where I need to create my own quick_sort algorythm and I need the swap function inside of it to work with void pointers.

#include <stdio.h>
#include <stdlib.h>

static void swap(char** x,char** y);

static void swap(char** x,char** y){
    char* temp=*x;
    *x=*y;
    *y=temp;
}

int main()
{
    char* s[2];
    s[0]="weee";
    s[1]="yooo";
    void* array=s;
    printf("before %s %s\n",s[0],s[1]);
    swap((&array)[0],(&array)[1]);
    printf("after = %s %s",(char*)array,(char*)array);
    return 0;
}

I think I’m missing something big
Thanks in advance 😀

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

void *array = s; declares array to be a void *. Then &array is the address of that void *, so &array[1] would access a void * after it. But there is no void * after it, since void *array defines a single void *.

array could be properly defined to alias s with char **array = s;, after which swap(&array[0], &array[1]); would work as desired.

If you define array as void **array = (void **) s;, then swap(&array[0], &array[1]); will produce diagnostic messages because the types are wrong. You could use swap((char **) &array[0], (char **) &array[1]);.

Then, if you print the strings with printf("after = %s %s", array[0], array[1]);, this will work, although it is not entirely proper code. Using array[0] as an argument passes a void * where printf is expecting a char * for the %s. However, the C standard guarantees that void * and char * have the same representation (encode their values using bytes in memory in the same way), and it further says (in a non-normative note) that this is intended to imply interchangeability as arguments to functions.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading