C программирование: Разыменование указателя на неполную ошибку типа

Мне определили структуру как:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

и массив указателей на те структуры:

struct stasher_file *files[TOTAL_STORAGE_SIZE];

В моем коде я делаю указатель на структуру и устанавливаю ее участников и добавляю его к массиву:

 ...
 struct stasher_file *newFile;
 strncpy(newFile->name, name, 32);
 newFile->size = size;
 newFile->start = first_free;
 newFile->popularity = 0;
 files[num_files] = newFile;
 ...

Я получаю следующую ошибку:

ошибка: разыменование указателя на неполный тип

каждый раз, когда я пытаюсь получить доступ к участникам внутри newFile. Что я делаю неправильно?

40
задан Right leg 11 January 2017 в 03:00
поделиться

4 ответа

Вы не определили struct stasher_file своим первым определением. Вы определили безымянный тип структуры и переменную stasher_file этого типа. Поскольку в вашем коде нет определения такого типа, как struct stasher_file , компилятор жалуется на неполный тип.

Чтобы определить struct stasher_file , вы должны были сделать это следующим образом

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

Обратите внимание, где в определении помещено имя stasher_file .

49
ответ дан 27 November 2019 в 01:33
поделиться

Вы используете указатель newFile, не выделяя для него места.

struct stasher_file *newFile = malloc(sizeof(stasher_file));

Также вверху следует поставить название структуры. Там, где вы указали stasher_file, необходимо создать экземпляр этой структуры.

struct stasher_file {
    char name[32];
    int  size;
    int  start;
    int  popularity;
};
13
ответ дан 27 November 2019 в 01:33
поделиться

Причина, по которой вы получаете эту ошибку, заключается в том, что вы объявили свой struct как:

struct {
 char name[32];
 int  size;
 int  start;
 int  popularity;
} stasher_file;

Это не объявление типа stasher_file. Это объявление типа anonymous struct и создание глобального экземпляра с именем stasher_file.

Что вы хотели сказать:

struct stasher_file {
 char name[32];
 int  size;
 int  start;
 int  popularity;
};

Но обратите внимание, что хотя ответ Брайана Р. Бонди не был верен в отношении вашего сообщения об ошибке, он прав в том, что вы пытаетесь записать в struct, не выделив для этого места. Если вам нужен массив указателей на структуры struct stasher_file, вам нужно вызвать malloc, чтобы выделить место для каждой из них:

struct stasher_file *newFile = malloc(sizeof *newFile);
if (newFile == NULL) {
   /* Failure handling goes here. */
}
strncpy(newFile->name, name, 32);
newFile->size = size;
...

(BTW, будьте осторожны при использовании strncpy; не гарантируется NUL-терминация)

.
1
ответ дан 27 November 2019 в 01:33
поделиться

Как вы на самом деле определили структуру? Если

struct {
  char name[32];
  int  size;
  int  start;
  int  popularity;
} stasher_file;

следует рассматривать как определение типа, в нем отсутствует определение типа . При написании, как указано выше, вы фактически определяете переменную с именем stasher_file , тип которой является анонимным типом структуры.

Попробуйте

typedef struct { ... } stasher_file;

(или, как уже упоминалось другими):

struct stasher_file { ... };

Последнее действительно соответствует вашему использованию типа. Первая форма потребовала бы, чтобы вы удалили структуру struct перед объявлением переменных.

10
ответ дан 27 November 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: