ошибка: запрос на член 'stream' во что-то, не являющееся структурой или объединением - PullRequest
0 голосов
/ 17 января 2012

Я пытаюсь создать поток команд для чтения, но у меня возникают проблемы с компиляцией или ошибками сегментации.Я хочу получить доступ к членам в моем struct command_stream, но при запуске я получу либо «ошибку: запрос на член« stream »в чем-то, не являющемся структурой или объединением», либо ошибку сегментации ».Мой код выглядит следующим образом.

typedef struct command_stream *command_stream_t;

struct command_stream
{  
    int stream[100];
    int test;                                                                                                                                            
};

//get_next_byte is function that returns next byte in stream
//get_next_byte_argument is pointer to FILE

command_stream_t
make_command_stream (int (*get_next_byte) (void *),void *get_next_byte_argument)
{

  command_stream_t * ptr = checked_malloc(sizeof(struct command_stream));
  int c;
  int count = 0;
  while((c = get_next_byte(get_next_byte_argument)) != EOF )
  {

      //(*ptr)->stream[0] = 0;
      //(*ptr)->test = 0;                                                                                                                                
      //ptr->test = 0;
      //ptr->stream[count] = c;
      count++;
      break;
  }
  return 0;
}

/////////////////////

checked_malloc - это функция, которая по сути является malloc,get_next_byte по сути является getc и получает следующий символ в файле.Проблемы исходят от птр.Если я пробую ptr-> test или ptr-> stream [count], я получаю ошибку «запрос на член 'stream' в чем-то, что не является структурой или объединением" ».Если я попробую (* ptr) -> stream [0] или (* ptr) -> test, ошибки компиляции не будет, но я получу ошибку сегментации.Что не так?

Ответы [ 2 ]

1 голос
/ 17 января 2012

ptr имеет тип command_stream_t*, который совпадает с struct command_stream **. Если вы хотите, чтобы ваш ptr имел тип command_stream_t*, вам следует изменить свой typedef с typedef struct command_stream* command_stream_t на typedef struct command_stream command_stream_t. Делая это, вы используете ptr-><field>, как вы хотели.

Тем не менее, (*ptr)-><field> не вернет действительный адрес. Отсюда и ошибка.

1 голос
/ 17 января 2012

Ваши объявления типов не соответствуют вашему использованию.Поскольку у вас есть typedef, который определяет command_stream_t как указатель на структуру, это означает, что ваша переменная ptr на самом деле является указателем на указатель на структуру.Вам нужно либо удалить * из typedef, либо удалить * из объявления ptr.

...