разыменование структуры от типа (void *) - PullRequest
6 голосов
/ 22 марта 2011

Я пытаюсь передать данные с указателем void, а затем привести их к типу (pData *).Что я делаю неправильно?gcc выдает мне

gcc test.c error: запрос на член 'filename' в чем-то, не являющемся структурой или объединением

typedef struct data {
        char *filename;
        int a;
} pData;

void mod_struct(void *data) {
        printf("%s\n",(pData *)data->filename); //error on this line
}

void main() {
        pData *data;
        data = (pData *) malloc(sizeof(pData));
        data->filename = (char *)malloc(100);
        strcpy(data->filename,"testing testing");
        data->a=1;
        mod_struct((void *)&data);
}

Ответы [ 5 ]

10 голосов
/ 22 марта 2011

Должно быть

printf("%s\n", ((pData *) data)->filename);

-> оператор имеет более высокий приоритет, чем оператор Typecast.

В дополнение к этому ваш звонок на mod_struct должен выглядеть следующим образом

mod_struct((void *) data);

То, что & у вас там, абсолютно бессмысленно. Почему вы берете адрес data, когда data уже указывает на то, что вам нужно?

4 голосов
/ 22 марта 2011

(pData *)data->filename эквивалентно (pData *)(data->filename); добавьте скобки, если хотите, чтобы это было ((pData *)data)->filename.

Кроме того, кстати, ваш код не работает. Вы передаете pData ** приведение к void *, а затем возвращаете его к pdata *.

2 голосов
/ 22 марта 2011

Вы приводите pData * к указателю void *, беря его адрес. так что вы фактически приводите pData ** к void *, поэтому вам нужно разыменовать его правильно

(*(pData**)data)->filename

или просто не берите адрес данных при преобразовании в основной

mod_struct((void *)data);
0 голосов
/ 02 сентября 2018

[TIPS C CODE] @Damir:

  data=(pdata *)malloc(sizeof(pdata));

Должно быть исправлено следующим образом:

data = malloc(sizeof(pdata));

Это не нужно, так как void * автоматически и безопасно повышается до любого другоготип указателя в этом случае.В одном случае: мобильность.Это, вероятно, будет хорошо, но в вашем случае я так не думаю, это были просто советы.вы можете разыграть, если хотите, но я думаю, что в этом нет необходимости.

В соответствии со стандартом ANSI C приведение является избыточным.

Хороших выходных.

0 голосов
/ 14 июня 2017
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>

 typedef struct {  
  char *filename;
  int a;
  }pdata;

void func(void * data)
{
  printf("%s \n",(*(pdata **)data)->filename);

}

int main()
{
  pdata *data;
  void *vptr=0;
  data=(pdata *)malloc(sizeof(pdata));
  data->filename=(char *)malloc(sizeof(50));
  vptr=&data;
  printf("enter the file name \n");
  scanf("%s ",data->filename);
  func(vptr);
  return 0;

}

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