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