Подтвердить что ты не робот

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. Что я делаю неправильно?

4b9b3361

Ответ 1

Вы не определили 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.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Try

typedef struct { ... } stasher_file;

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

struct stasher_file { ... };

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

Ответ 4

приведенный выше случай относится к новому проекту. Я ударил эту ошибку при редактировании вилки хорошо установленной библиотеки.

typedef был включен в файл, который я редактировал, но структура не была.

Конечным результатом является то, что я пытался отредактировать структуру в неправильном месте.

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

Ответ 5

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

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

Это не объявление типа stasher_file. Это объявляет анонимный тип 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.)