tags:

views:

98

answers:

2
int size=2;
char *a0;
char **allargs;
short *a1;
void **args;
allargs=(char **)malloc(size*sizeof(char *));
allargs[0]="a";
allargs[1]="100";
args=(void **)malloc(size*sizeof(void *));

a0 = malloc(sizeof(char *));
*a0=(*allargs[0]);
args[0]=(void *)&a0;
fprintf(stderr,"assigned %c %c\n",*a0,*((char *)args[0]));

a1 = malloc(sizeof(short *));
*a1=atoi(allargs[1]);
args[1]=(void *)&a1;
fprintf(stderr,"assigned %d %d \n",*a1,*((int *)args[1]));

for some reason i am getting the following for the output

assigned a (should be a a )

assigned 100 166696 (should be 100 100)

A: 

When you take the address of a0 and a1 to fill in args, you're getting a double-pointer. When you calculate your output, you're only dereferencing once. There are two ways that you can fix this to get the output you want. You can change

args[0]=(void *)&a0;

to

args[0]=(void *)a0;

and change

args[1]=(void *)&a1;

to

args[1]=(void *)a1;

so that args contains single-pointers, OR you can change

fprintf(stderr,"assigned %c %c\n",*a0,*((char *)args[0]));

to

fprintf(stderr,"assigned %c %c\n",*a0,**((char **)args[0]));

and change

fprintf(stderr,"assigned %d %d \n",*a1,*((int *)args[1]));

to

fprintf(stderr,"assigned %d %d \n",*a1,**((int **)args[1]));

to double-dereference args during display.

Aidan Cully
+1  A: 

You should cast args[0] and args[1] to char** and int**.

fprintf(stderr,"assigned %c %c\n",*a0,**((char **)args[0]));
fprintf(stderr,"assigned %d %d \n",*a1,**((int **)args[1]));
onof