Мне определили структуру как:
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
. Что я делаю неправильно?
Вы не определили 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
.
Вы используете указатель newFile
, не выделяя для него места.
struct stasher_file *newFile = malloc(sizeof(stasher_file));
Также вверху следует поставить название структуры. Там, где вы указали stasher_file, необходимо создать экземпляр этой структуры.
struct stasher_file {
char name[32];
int size;
int start;
int popularity;
};
Причина, по которой вы получаете эту ошибку, заключается в том, что вы объявили свой 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-терминация)
Как вы на самом деле определили структуру? Если
struct {
char name[32];
int size;
int start;
int popularity;
} stasher_file;
следует рассматривать как определение типа, в нем отсутствует определение типа
. При написании, как указано выше, вы фактически определяете переменную с именем stasher_file
, тип которой является анонимным типом структуры.
Попробуйте
typedef struct { ... } stasher_file;
(или, как уже упоминалось другими):
struct stasher_file { ... };
Последнее действительно соответствует вашему использованию типа. Первая форма потребовала бы, чтобы вы удалили структуру struct
перед объявлением переменных.