Вопрос по пустоте ** - PullRequest
       4

Вопрос по пустоте **

0 голосов
/ 09 июля 2010
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]));

по какой-то причине я получаю следующее для вывода

присвоено (должно быть)

назначено 100 166696 (должно быть 100 100)

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Вы должны привести args [0] и args [1] к char ** и int **.

fprintf(stderr,"assigned %c %c\n",*a0,**((char **)args[0]));
fprintf(stderr,"assigned %d %d \n",*a1,**((int **)args[1]));
0 голосов
/ 09 июля 2010

Когда вы берете адреса a0 и a1 для заполнения args, вы получаете двойной указатель. Когда вы рассчитываете выход, вы разыменовываете только один раз. Есть два способа исправить это, чтобы получить желаемый результат. Вы можете изменить

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

до

args[0]=(void *)a0;

и изменить

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

до

args[1]=(void *)a1;

так что args содержит одиночные указатели, ИЛИ вы можете изменить

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

до

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

и изменить

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

до

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

для двойного разыменования args во время отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...