Указатель непрозрачной структуры

В моей библиотеке есть структура экземпляров, которая содержит все необходимое для библиотеки, поэтому вы можете определить несколько экземпляров библиотеки. Библиотека требует, чтобы пользователь определил свое собственное расширение или пользовательские переменные.

Вот что я попробовал:

Library.h

typedef struct custom_s *custom;

typedef struct {
    int a;
    int b;
    custom customs;
} instance;

И тогда пользователь может просто сделать:

main.C

// User sets their own custom structure
struct custom_s {
    int c;
};

int main(void) {
    instance test;
    test.customs.c = 1;
}

Однако я получаю ошибку "Ошибка сегментации".

2 ответа

Решение

Не должно ли это быть:

test.customs->c = 1

Так как вы напечатали это в

typedef struct custom_s *custom;

и используется как

custom в структуре экземпляра.

Который никогда не выделяется...

typedef struct custom_s *custom;

Определяет указатель на custom структура. В вашем примере это неопределенный указатель, который никогда не выделяется, поэтому при попытке доступа к нему возникает ошибка сегментации.

Одним из побочных эффектов непрозрачных структур является то, что размер неизвестен клиентскому коду. Это означает, что вы должны создавать свои собственные функции для их распределения / создания.

Сделать что-то вроде:

instance test;
test.customs = customs_create();
test.customs.c = 1;
Другие вопросы по тегам